今、メインフラグメントでダブルタップをするとサブフラグメントに置き換えている。
サブフラグメントでダブルタップをするとメインフラグメントへ置き換えられる。
サブフラグメントでは1枚の画像を元のサイズで表示。大きければスクロールさせている。
普通と思われる速度でのダブルタップであれば例外は発生しないが高速でダブルタップを繰り返すと例外停止となる。
以前、新たにフラグメントを開くときに条件により例外停止が起こる。(遅延実行で対応。)
Viewを構築していくときに競合や不足が起こる?ため。
FragmentManager().beginTransaction().replace().commitNow();
commitNow() で時間調整をして表示させるみたいらしい。
自分の使い方が規則にのっとっている訳ではないので問題が発生しているのかもしれない。
今後の対処は
・タイマー組み込んで時間調整をする。
・フラグメントの置き換えでなくImageViewを1つ追加してViewの切り替えで対応させる。
・正当なフラグメントの切り替え。
・メモリを浪費したくない。切り替え速度は速くしたい。新しい方法を考える。
機能別にフラグメントを分けていてプログラムはスッキリしている。
できれば、フラグメントの置き換えで例外発生をなくしたい。
<追記>
Navigationを使ってフラグメントを偏移(置き換え?)させられる。
一度経験を…。かなり昔にサンプルで試したんだった。けど面倒くさかった。
要点だけ抜き出した説明を見つけたので切り替えをしてみる。
<追記、10/27>
フラグメントの構成。
メイン画面 ⇔ 元画像画面
┃
┣━ ⇔ サムネイル画像画面 ⇒ ディレクトリ移動画面
┃
┣━ ⇔ ディレクトリ移動画面
┃
┗━ ⇔ ブックマーク選択&編集画面
getSupportFragmentManager().beginTransaction() もしくは、getParentFragmentManager()
.replace(R.id.container, mFragment).commitNow();
画面の変更はこれを使ってフラグメントを置き換えている。
メモリ消費を最小限にしたいから使い終わったものを開放して再利用させる。
この置き換え方法で最初の問題がでた。
【メイン画面 ⇔ ディレクトリ移動画面】
フラグメントの置き換えのタイミングで例外が発生。
次のフラグメント表示を遅延実行する事で例外を回避できた。
その後にアプリで想定される操作負荷をすると
・長押し判定が微妙でフリングを速く繰り返していると onLongPress() がコールされる。
onFling() では、return true;でイベント消費しているから何かしらのタイミングで回っているようだ。
フラグ設定とかでも弾けない。長押し時間を取得して時間条件を作り誤動作を減らせた。
・ダブルタップを速く繰り返すと
【メイン画面 ⇔ 元画像画面】
置き換え後に例外が発生。通常のダブルタップであれば例外は発生しない。
遅延実行を入れれば高速ダブルタップ連続実行では例外を抑えられる。
しかし、通常ダブルタップでも遅延が入りストレスとなる。
フラグメントマネージャーでは置き換え時の整合、ジェスチャー処理が問題を抱えている。
やれることは例外処理を追加。だけど、フラグメント作成時点のView構築描写時点の例外処理…。難しい。
おそらくViewの情報が揃わず、その情報を参照してしまってクラッシュ。遅延実行で回避できている以上そういうことだろう。
commitNow() でViewの生成や追加のタイミングをある程度調整してくれるそう。それでも吸収しきれない何かがある。
今後の方針は
・デザインを変える。
・問題のないフラグメント切り替え方法を探す。
・フラグメントの理解を深める。そして新しい方法を見つける。あぁ面倒くさっ!
今、ナビゲーションを使ったフラグメント切り替えを試している。ただ、移植は難航。
色々な部分で例外発生。分からない事も多い。
同じフラグメント構成なのに同じプログラム構成なのに問題が起こる。***<追記、10/28>で説明。***
参照情報の構築タイミングが変わるためか参照時点でクラッシュが起こっているのだろう。
説明では後続フラグメントで参照内容によりコールバックを元へ送り対応しているものもあった。
やり方は理解不足でまだ使えない。
取り合えず、ナビゲーションは後回しにしてデザインを変更する。
問題の大きさでいうと高速ダブルタップ繰り返しの例外停止。
【メイン画面 ⇔ 元画像画面】
フラグメント置き換えではなく、メインフラグメントに元画像表示用のImageViewを用意して表示非表示を切り替えて対応させる。
一番簡単な対応策だけどプログラムはゴチャゴチャしてくる。
クラス定義で分離できれば見やすくなるが、ジェスチャー処理も含められるか分からない。
クラス定義はついでに考えるとして、操作での不具合を潰していく。
あ、今思いついた事を試してからImageViewを組み込む。
ナビゲーションの参照例外が起こっている所で参照を待たせるメソッドを噛ませる。
タイマー制限で強制終了かキャンセルを選択させるみたいな。
結果を積み重ねるのがプログラムだ。
リファレンスを全部覚えるというのはヤル気が出ない(´・ω・)
<追記、10/28>
NEWプロジェクトのfragment + viewmodelという雛形でナビゲーションを組み込んだ場合は発生。
NEWプロジェクトの empty activity でナビゲーションを組み込んだ場合は例外が発生しなかった。
@Override
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
TextView textView = view.findViewById(R.id.textview);
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
}
setOnClickListener()の場所で例外が発生する、発生しないに分かれる。
fragment + viewmodelでプロジェクトを作るとui.mainというフォルダにFragmentが入れられる。
何かしら構造が違うのかもしれない。原因は分からない。