【#Android】Fragment中のTextureViewにて表示不具合でえらい目にあった
関連記事
- Oracleのライセンスモデル変更によりJavaのコストが急増する可能性 【2023年04月06日(木)】
- 次期 #Android ではスマホで衛星と通信する――グーグル幹部がツイート 【2022年09月02日(金)】
- 【独自】3ヶ月で壊れる格安スマホ「AQUOS sense5G」不具合をシャープが認めて謝罪 【2022年01月25日(火)】
- 【#デジタル庁】新型コロナワクチン接種証明書アプリ:69900エラー出て証明書が表示されない(怒 【2021年12月20日(月)】
- 【Log4j】ログ管理ソフトに欠陥、Amazonなど調査(21/12/14) 【2021年12月14日(火)】
謎の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); } } }
コメント
【#RUANG】インドネシア:ルアング山で火山が大規模噴火:愛媛で震度6弱な緊急地震速報(24/4/18)
イオンモール宮崎の辺りにイノシシが登場した,らしい
コンビニ誤交付、富士通に行政指導 原因究明と再発防止を要求―総務省
【#桜】花立公園で桜見物してきた!都井岬まで足を伸ばした!遠かった(爆
【#大谷翔平】水原一平氏、米連邦検察が銀行詐欺容疑で訴追…大谷翔平選手の口座から24億5千万円以上を不正送金
【#緊急地震速報】宮崎県日南市で震度5弱 津波の心配なし M5.2(24/2/8)
ずっと天気が悪いのぉ.菜種梅雨とはよく言ったものやじ(24/4/5)
【#暴風警報】宮崎市に暴風警報発令(24/3/26)