現在、ログイン アクティビティ、「メイン」アクティビティ (ユーザー情報、概要など)、および単一レコードのデータ入力アクティビティの 3 つのアクティビティに分割されているデータ入力アプリケーションを作成しています。これらの各アクティビティには、いくつかの異なる「画面」 (つまり、一連のビューを含むフルページ レイアウト) があり、これらの各画面は単一のフラグメントです。
2 つの質問があります。
これは適切な全体的なアーキテクチャですか? アクティビティ/フラグメントの分割はやや恣意的ですが、これらのパーティションは私にとって意味のあるものです。
アクティビティ内のフラグメント間の切り替えを管理する最良の方法は何ですか? 私の主なアクティビティは、タブ + スワイプ ナビゲーション構造に基づいているため、
ViewPager
andを使用しますが、すべてのアクティビティには、メニュー項目として表されないフラグメントがあります。これには aなしで aFragmentPagerAdapter
を使用する必要がありますか (そうであれば、どのように)? 遷移を処理するために独自の抽象化レイヤーを作成する必要がありますか?FragmentPagerAdapter
ViewPager
多くのチュートリアルと例を読みましたが、この特定のパターンが使用されているのを見たことがありません。私は Android 開発の経験があまりないので、独自のソリューションを作成する前に、既製のソリューションがあるかどうかを確認するのが最善だと考えました。アドバイスをいただければ幸いです。ありがとう!
編集:これは、タイトルページとログインページの2つの「画面」を切り替えるための非常に単純化されたバージョンとして、現時点で私が持っているものです。これは、処理したいことのほとんどを示しています (フラグメント インスタンスの保持、トランザクションの管理、レイアウトへの配置)。PagerAdapter と ViewPager の機能をいくつかの方法で複製しているように見えますが、主なナビゲーションはアプリ内のボタンを介して行われるため、メニュー、タブ、スワイプなどに結び付けたくありません。また、より複雑なフラグメントのフラグメント初期化にいくつかの初期データを渡す必要があります。
public class LoginFragmentSwitcher {
private int mCurFragIndex;
private ArrayList<Fragment> mFragList;
public LoginFragmentSwitcher() {
//set initial index
mCurFragIndex = 0;
//create fragments
mFragList = new ArrayList<Fragment>();
mFragList.add(new TitleFragment());
mFragList.add(new LoginFragment());
//TODO: more fragments will be added here
//display the first fragment
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.fragment_container, mFragList.get(0));
ft.commit();
}
// Perform a fragment transition to the specified index
public void showFragment(int newFragIndex) {
//only switch if you're not already showing the appropriate fragment
if (newFragIndex != mCurFragIndex) {
//start the fragment transaction
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
//TODO: apply transition style if desired
//switch content to the new fragment
ft.replace(R.id.fragment_container, mFragList.get(newFragIndex));
//register entry in the back stack and complete transaction
ft.addToBackStack(null);
ft.commit();
//update index
mCurFragIndex = newFragIndex;
}
}
}