このブログ「吟遊詩人の戯言」 の記事検索...

【#Android】Fragment中のTextureViewにて表示不具合でえらい目にあった

関連記事

謎のAndroidスマフォな案件
動画の撮影機能も入れてね♥だったんで入れてみたら...

Fragment(Windows FormでいうTabコントロールっすな)に,TextureView(カメラからの動画をプレビューさせるコントロール)
を貼っつけて,カメラを運転させると...

タブを切り替えたら,カメラプレビューが表示されなくなるっ!(な,なんだってぇ~~~爆

っちゅうか,タブを切り替える度に,FragmentのUIインスタンス破棄動作~再作成動作「onCreateView()」が走りやがる.
カメラ運転開始時に作成登録したUIインスタンスが消失するから,カメラ取得した画像を投げつける相手がいなくなるんで,そりゃ表示されんわなぁ...

ってことで,TextureViewを破棄させないようにするとか,Cameraオブジェクトのプレビューを一旦停止して再作成した,TextureView.SurfaceTextureを設定してやったりしたけど,ダメ
24時間も格闘してしもた...泣

って,そもそもなして,Fragmentはタブが切り替わるたんびにUIを破棄するんじゃ?
そこが納得いかん!!と怒り狂って,あちこちチェックコードを入れたけど破棄を抑止する方法がわかんね...

ふと,Fragment群全体を束ねるクラスの実装に目が言った.こちら「TabListenerインターフェース」を実装したやつ

こやつ,タブが切り替わるたんびに,FragmentTransaction.detach()が走るなぁ...怪しぃ...
detach()の度に,UIのインスタンス破棄してるんじゃねか?
googleサイトに行ってandroidのAPIドキュメント確認したら,FragmentTransaction.hide()なるメソッドがあるじゃん…コレに変えてみたら...

タブ変えても,プレビューされ続けるぞぉ!キタ━━━━(゚∀゚)━━━━!!

ってことで,難儀したんで,ここに書いておきまする.あとから来られる人が悩まれないように...

//------------------------------------------------------------------
//タブの制御クラス
//
//------------------------------------------------------------------
public class MainTabListener<T extends Fragment> implements TabListener
{

    public  Fragment fragment;
    private final Activity activity;
    private final String tag;
    private final Class<T> cls;

    //------------------------------------------------------------------
    //コンストラクタ
    //
    //------------------------------------------------------------------
    public MainTabListener( Activity activity, String tag, Class<T> cls)
    {
        fragment = null;
        this.activity = activity;
        this.tag = tag;
        this.cls = cls;
    }
    
    //------------------------------------------------------------------
    //タブのリリース
    //
    //------------------------------------------------------------------
    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft)
    {
    }

    //------------------------------------------------------------------
    //タブの選択
    //
    //------------------------------------------------------------------
    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft)
    {
        if(fragment == null)
        {
            fragment = Fragment.instantiate(activity, cls.getName());
            ft.add(android.R.id.content, fragment, tag);
            ft.show(fragment);
        }
        else
        {
            //ft.attach(fragment);                  //attach-detachは再作成[onCreateView()]がここ通る度に走るっぽい
            ft.show(fragment);
        }

    }

    //------------------------------------------------------------------
    //タブの非選択
    //
    //------------------------------------------------------------------
    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft)
    {
        if(fragment != null)
        {
            //ft.detach(fragment);                  //attach-detachは再作成[onCreateView()]がここ通る度に走るっぽい
            ft.hide(fragment);
        }
    }
}

 
 
 
 

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <img localsrc="" alt="">