Android学習ノート7:Fragmentを使用したダイナミックUIの作成

7819 ワード

Fragmentとは?
Fragment翻訳は破片の意味です.fragmentはActivityに似ていて、独自のレイアウトがあり、対応するjavaクラスがあり、同じライフサイクルがあります.
FragmentはUIセグメントとして理解されるべきで、ビジネスロジック上のモジュールです.例えば、新しいユーザーを登録するActivityがあります.メールボックスのパスワードの設定と個人情報の記入の2つのステップが含まれています.私たちはこの2つをそれぞれfragmentにすることができます.携帯電話では2つのステップに分けて、次のステップをクリックしてから個人情報を記入し、タブレットに直接1つの画面に表示することができます.
Fragmentの意味は、UIを機能別に抽出して独立したモジュールにカプセル化し、異なるactivityでこれらのUIモジュールを参照することである.したがって、アプリケーションの設計が合理的であれば、Activityではfragmentを組み立てるだけで、activityにボタンなどのコンポーネントを直接書くことはなく、すべてのUI実装はFragmentによって完了します.これにより、デバイスサイズに応じて異なるレイアウトを表示したり、ユーザーが自分のレイアウトを自由にカスタマイズしたりすることができます.
異なるサイズのスクリーンに異なるレイアウトを作成
もし私たちが読書アプリを作るとしたら、携帯電話には2つのインタフェースがあります.1つは文章のリストで、1つは文章の内容です.携帯電話では文章リストをクリックして文章の内容にジャンプします.しかし、タブレットでは画面が大きいので、左側にリストを表示し、右側に文章の内容を直接表示し、切り替える必要はありません.
では、この時私たちはFragmentで実現する必要があります.まず、Activityの書き方と変わらない2つのFragmentのXMLファイルを作成します.
fragment_detail.xml:



    



fragment_list.xml:



    



次に、対応するjavaクラスを作成します.これらのJAVAクラスはandroid.app.Fragmentから継承され、onCreateViewメソッドを書き換えて対応するビューを指定します.
FragmentDetail.java:
public class FragmentDetail extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_detail, container, false);
    }
}

FragmentList.java
public class FragmentList extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_list, container, false);
    }
}

2つのFragmentが使えますactivityでmain.xmlで参照:


    



これはデフォルトのレイアウトで、FragmentListのみが使用されています.つまり、デフォルトは文章のリストを表示するだけで、クリックしてから文章の詳細が表示されます.
次にres/layout-large/activity_main.xmlを作成し、タブレットの左側にリストを表示し、右側に詳細を表示します.


    

    



それぞれ携帯電話とタブレットでコードを実行すると、下の図のように異なるレイアウトが見えます.左側は携帯電話で、右側はタブレットです.
動的Fragmentの作成
上の用法はただ静的にFragmentを引用するだけで、実はFragmentが本当に強いところはそれが動的に操作することができることです.携帯電話でリストをクリックして文章の詳細にジャンプする機能を実現しました.
Fragmentを動的に置き換えるには、まず彼に容器を指定する必要があります.ここではFrameLayoutを容器として使用します.修正activity_main.xmlは次のとおりです.


    

        

    



次に、fragment_list.xmlにボタンを追加し、MainActivity.javaでボタンのクリックイベントを傍受し、FragmentManagerで現在のfragmentを動的に置き換えます.
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.initialize();
    }

    public void initialize() {
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FragmentDetail detail = new FragmentDetail();
                FragmentManager fragmentManager = getFragmentManager();
                FragmentTransaction transaction = fragmentManager.
                        beginTransaction();
                transaction.addToBackStack(null);     //  ,              
                transaction.replace(R.id.frame1, detail);     //    
                transaction.commit();
            }
        });
    }
    @Override
    public void onBackPressed() {
        if (getFragmentManager().getBackStackEntryCount() > 0 ){//     fragment   ,  。
            getFragmentManager().popBackStack();
        } else {
            super.onBackPressed();
        }
    }

}

上記のコードでは、getFragmentManager()によってfragmentManagerのインスタンスを取得し、Fragmentを動的に置き換えることができる.
FragmentとActivity間の通信
FragmentとActivityは互いに相手のインスタンスの参照を得ることができるので,互いに通信することができる.ActivityではgetSupportFragmentManager().findFragmentById(R.id.article_fragment)でfragment参照を取得します.Fragmentでは、public void onAttach(Activity activity)メソッドを上書きすることによってactivity参照を取得するか、getActivity()メソッドを直接取得することができる.
政府は複数のfragment間の直接通信を提案せず、彼らのActivityを通じて通信する.すなわち,一つのFragmentで別のFragmentのメソッドを直接呼び出すべきではない.
公式チュートリアルでは、インタフェースを通じて通信を実現することをお勧めします.Fragmentでインタフェースを提供し、Activityで実装します.このインタフェースで通信することで,FragmentでActivityと結合しない.インタフェースの書き方はここを参照してください.http://developer.android.com/training/basics/fragments/communicating.html