タブレット用プログラムの書き止め

android OS & iPadOS の記録。

Fragment [基礎] メイン、サブの高速置き換えの例外発生。

2022-10-30 18:21:18 | Android studio 日記


それぞれのフラグメント上のダブルタップがトリガーとなり
  FragmentManager().beginTransaction()
                        .replace(R.id.container, mFragment)
                        .commitNow();
で置き換えを実行する。

高速で置き換えが起こるとView構築で不具合が起こり例外が発生する。
対策は高速切り替えをさせない。遅延実行など。
折り合いがつかない場合はトリガー方法を変える。
片方をダブルタップで切り替え確認させるダイアログを表示など。色々考える。


1つの方法のナビゲーションは習得に時間がかかるので後回し。
調整を試みたがすべて効果無し。
MainFragment ⇔ SubFragmentの置き換えはやめて
MainFragment ⇔ 内部 ImageView の切り替えに変更した。

高速切り替えは問題なく実行できた。
ただ、大きなサイズの画像を切り替え表示で連続させると、1回目は表示、2回目はメモリ不足でスキップ。

SubFragmentでは何回でもメイン画像 ⇔ 元画像を切り替えられたのだが。(ちょっと大きな画像)
メモリ解放かメモリ浪費に原因があるのかもしれない。
意図的に解放させる手段を施したがあまり変わらない。


最終的にメイン画像を表示しているImageSwitcherのカレントビューをmRealImageViewとして借り受け元サイズの画像を表示させる。
今のところ不具合は無く、切り替え速度、メモリ不足のスキップは抑えられている。(前の同じ画像)
更に巨大な画像はメモリ不足になるけれども。


大雑把にそれぞれのイベントでメイン画像処理と元画像表示処理に分岐している。
大半をジェスチャークラス内でコード作成できたのでまぁいいかな。少し煩雑…。

大分省略。

    private ImageSwitcher mImageSwitcher = null;
    private MyImageView mRealImageView;


    private class MyGestureListener extends GestureDetector.SimpleOnGestureListener {

        @Override
        public boolean onDoubleTap(MotionEvent event) {// 実サイズ表示へ移行

            if ( mMainImageFlag ){
                mMainImageFlag = false;
                realDoubleTap(event);
            } else {
                mMainImageFlag = true;
                mainDoubleTap(event);
            }

            return true;
        }

        // main

        private void mainDoubleTap(MotionEvent event) {
            refreshImage();
        }

 

        // real

        private void realDoubleTap(MotionEvent event) {
            File file = new File( mFileList.getFileNameAbsolutePath( touchDisplayNo( event.getX(), event.getY() ) ) );
            if ( !file.exists() || !file.isFile() ) return;

            clearImageSwitcher();
            if ( !setRealImage(file) ) {
                mMainImageFlag = true;
                refreshImage();
            }
        }
        private boolean setRealImage(File file) {
            // 元サイズのまま mRealImageView にBitmapを設定。

            省略

            return true;
        }
        private void clearImageSwitcher() { // ImageSwitcherのカレントビューを利用する

            mRealImageView = (MyImageView) mImageSwitcher.getCurrentView();
            ((MyImageView)mImageSwitcher.getNextView()).setImageBitmap(null);
        }

        private void realDown() {
            省略
        }

        private void realScroll(float distanceX, float distanceY) {
            省略
        }

        private void realFling(float velocityX, float velocityY) {
            省略
        }
    }


ほんと行き当たりばったり^^;