[解決済み] 方向転換時のフラグメンテーションの扱い方のコツ
2023-04-15 11:40:34
質問
public class MainActivity extends Activity implements MainMenuFragment.OnMainMenuItemSelectedListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
// add menu fragment
MainMenuFragment myFragment = new MainMenuFragment();
fragmentTransaction.add(R.id.menu_fragment, myFragment);
//add content
DetailPart1 content1= new DetailPart1 ();
fragmentTransaction.add(R.id.content_fragment, content1);
fragmentTransaction.commit();
}
public void onMainMenuSelected(String tag) {
//next menu is selected replace existing fragment
}
2つのリストビューを並べて表示し、左側にメニュー、右側にコンテンツを表示する必要があります。デフォルトでは、最初のメニューが選択され、そのコンテンツが右側に表示されます。コンテンツを表示するFragmentは以下の通りです。
public class DetailPart1 extends Fragment {
ArrayList<HashMap<String, String>> myList = new ArrayList<HashMap<String, String>>();
ListAdapter adap;
ListView listview;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if(savedInstanceState!=null){
myList = (ArrayList)savedInstanceState.getSerializable("MYLIST_obj");
adap = new LoadImageFromArrayListAdapter(getActivity(),myList );
listview.setAdapter(adap);
}else{
//get list and load in list view
getlistTask = new GetALLListTasks().execute();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.skyview_fragment, container,false);
return v;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable("MYLIST_obj", myList );
}
}
onActivityCreatedとonCreateViewを呼び出します。
2回
. フラグメントを使用した例は、世の中にたくさんあります。私はこのテーマでは初心者なので、私の問題と例を関連付けることができません。私は方向転換を処理するための確実な方法が必要です。私は宣言していません
android:configChanges
マニフェストファイルで宣言していません。私は、ランドスケープモードで異なるレイアウトを使用できるように、アクティビティを破棄して再作成する必要があります。
どのように解決するのですか?
アクティビティで画面を回転させるたびに、新しいフラグメントが作成されている
onCreate();
しかし、古いものを維持するために
super.onCreate(savedInstanceState);
. そこで、タグを設定して、フラグメントが存在する場合はそれを見つけるか、superにnull bundleを渡すとよいでしょう。
これは学ぶのに時間がかかり、viewpagerのようなものを使っているときには本当に苦痛になります。
私は、以下の本を読むことをお勧めします。 フラグメント を読むことをお勧めします。
ここでは、通常の方向転換の際にフラグメントをどのように処理するかの例を示します。
アクティビティ :
public class MainActivity extends FragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
TestFragment test = new TestFragment();
test.setArguments(getIntent().getExtras());
getSupportFragmentManager().beginTransaction().replace(android.R.id.content, test, "your_fragment_tag").commit();
} else {
TestFragment test = (TestFragment) getSupportFragmentManager().findFragmentByTag("your_fragment_tag");
}
}
}
フラグメント :
public class TestFragment extends Fragment {
public static final String KEY_ITEM = "unique_key";
public static final String KEY_INDEX = "index_key";
private String mTime;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_layout, container, false);
if (savedInstanceState != null) {
// Restore last state
mTime = savedInstanceState.getString("time_key");
} else {
mTime = "" + Calendar.getInstance().getTimeInMillis();
}
TextView title = (TextView) view.findViewById(R.id.fragment_test);
title.setText(mTime);
return view;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("time_key", mTime);
}
}
関連
-
[解決済み】プログレスダイアログとバックグラウンドスレッドがアクティブなときに、画面の向きが変わるのをどう処理するか?
-
[解決済み】Androidで向きを変えないようにするにはどうしたらいいですか?
-
[解決済み] 設定ページに移動せずに位置情報サービスをオンにする
-
[解決済み] android: imageview の画像を画面に合わせて伸縮させる
-
[解決済み] アンドロイドフラグメント onRestoreInstanceState
-
[解決済み] Androidの連絡先リストを呼び出すには?
-
[解決済み] Studio 3.4 をアップデートしたら、引数の leftShift() メソッドが見つかりませんでした。
-
[解決済み] アンドロイドのdatepickerダイアログで最大の日付を設定するには?
-
[解決済み] RecyclerViewのアイテムに波及効果を追加する
-
[解決済み] 実行に失敗しました app:processDebugResources Android Studio
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] CardView layout_width="match_parent "が親のRecyclerViewの幅と一致しない。
-
[解決済み] アプリ内課金テスト:android.test.purchased already owned
-
[解決済み] DialogFragmentを正しく終了させるには?
-
[解決済み] onCreate(Bundle savedInstanceState)とは?
-
[解決済み] Studio 3.4 をアップデートしたら、引数の leftShift() メソッドが見つかりませんでした。
-
[解決済み] 文字サイズとアンドロイドの画面サイズの違い
-
[解決済み] Androidアプリケーションのヒープサイズを大きくするには?
-
[解決済み] AndroidでTextViewの下にアンダーラインを引くには
-
[解決済み] Travis.yml ./gradlew : パーミッションが拒否されました。
-
[解決済み] Android Fragmentのライフサイクルにおける方向性の変更について