Android入門チュートリアル | フラグメント(読み込み方法と通信)

ここに画像の説明を挿入します

フラグメントロード方式

ロードには2つの方法があります

  • XMLファイルに登録する
  • Javaコードをロードする

XML に登録します

たとえば、次のようにfragment_demo.xml定義されます。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <fragment
        android:id="@+id/main_fragment_up"
        android:name="com.rust.fragment.FirstFragment"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <fragment
        android:id="@+id/main_fragment_bottom"
        android:name="com.rust.fragment.SecondFragment"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />
</LinearLayout>

com.rust.fragment.SecondFragmentつまり、Fragment サブクラスはメソッドをSecondFragment.javaオーバーライドし、定義されたビューを返します。onCreateView

アクティビティに直接ロードするだけです

setContentView(R.layout.fragment_demo);

Javaコードのロード

① Fragment xml レイアウト ファイルを準備する ② Fragment を継承して新しいクラスを作成、このクラス内で Fragment レイアウト ファイルを見つける ③ Activity で FragmentManager を使用して Fragment を操作する ④ コミットを忘れない

まずレイアウトファイルをカスタマイズしますfragment_first.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#0011ff" >
<!-- <Button
    android:id="@+id/btn_fragment1_1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/btn_fragment1"
    android:textSize="16sp"
       />
<EditText
    /> -->
</LinearLayout>

Fragmentを継承した新しいクラスを作成しますFirstFragment.javaコピーonCreateView方法。このメソッドではonCreateView、Fragment 上のコントロールを操作できます。

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
    
    
        View rootView = inflater.inflate(R.layout.fragment_first, container,false);
//    fragment_first是自定义好的布局
//    如果此Fragment上放了控件,比如Button,Edittext等。可以在这里定义动作
  btn_fragment1_send = (Button) rootView.findViewById(R.id.btn_fragment1_1);
//...
        return rootView;
    }

activity_main.xmlFramelayout を使用してその位置を占めるなど、Fragment の位置を準備します。

    <FrameLayout
        android:id="@+id/layout_container1"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="4" >
    </FrameLayout>

ではMainActivity.java、最初に FragmentManager を取得し、次に FragmentTransaction を取得します。Fragmentの追加や削除などの操作はFragmentTransactionによって完了します。

f1 = new FirstFragment();    //    获取实例
f2 = new SecondFragment();    //
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.add(R.id.layout_container1,f1);    //    添加
fragmentTransaction.replace(R.id.layout_container1,f1);    //    替换
// 或者也可以写成
fragmentTransaction.replace(R.id.layout_container1,new FirstFragment());
//              fragmentTransaction.addToBackStack(null);   //添加到返回栈,这样按返回键的时候能返回已添加的fragment
fragmentTransaction.commit();    //别忘了commit
//    移除操作 getFragmentManager().beginTransaction().remove(f1).commit();

XML での登録と比較して、コードの読み込みはより柔軟です。個人的には動的読み込みの方が好きです。

フラグメントとアクティビティの連携

最初にアクティビティが実行されonResume、次にonResume現在のフラグメントが実行されます。現在のフラグメントは置き換えられ、再度置き換えられると、一部の状態は再初期化されません。置換が実行されると、フラグメントの宣言サイクルが再度実行されます。安全なアプローチは、onCreateViewで必要な変数を初期化することです。たとえば、一部のステータス値をリセットします。複数のフラグメントを切り替える場合は、特別な注意が必要です。

フラグメント間の通信

フラグメントの Java ファイルでは、getActivity()それを呼び出すアクティビティを取得するために使用し、通信する別のフラグメントを見つけることができます。

getActivity().getFragmentManager().findFragmentById(R.id.fragment_list);

ただし、この結合は高すぎるため、その後の変更操作には不便です。

フラグメントとそれに接続されたアクティビティ間の通信はアクティビティによって完了する必要があり、複数のフラグメント間で直接通信することはできません。

フラグメントとそれに接続されたアクティビティ間の通信方法:
  • イベントを開始するフラグメントでインターフェイスを定義し、そのインターフェイスでメソッドを宣言します。
  • onAttach メソッドでこのインターフェイスを実装するにはアクティビティが必要です
  • このメソッドをアクティビティに実装します

たとえば、アクティビティには 2 つのフラグメントが配置されており、それらの間の通信はアクティビティに依存します。

コード:ListStoreActivity.java NewItemFragment.java ListStoreFragment.java

レイアウト ファイルは次のとおりです。liststore.xml new_item_fragment.xml

レイアウトファイルを準備します

liststore.xmlLinearLayout を使用して 2 つのフラグメントを配置し、それぞれ 2 つの Fragment ファイルを指定し、new_item_fragment.xmlEditText とボタンを並べて配置します。

ListStoreFragment.java前に定義したインターフェイスを使用する

public class ListStoreFragment extends ListFragment{
    
    
/// 继承自ListFragment,已经封装好了listview
/// 不需要自己写ListView了
}

NewItemFragment.java

/**
 * 声明一个接口,定义向activity传递的方法
 * 绑定的activity必须实现这个方法
 */
    public interface OnNewItemAddedListener {
    
    
        public void newItemAdded(String content);
    }
    private OnNewItemAddedListener onNewItemAddedListener;
    private Button btnAddItem;
    /*复写onAttach方法*/
    @Override
    public void onAttach(Activity activity) {
    
    
        super.onAttach(activity);
        try {
    
    
            onNewItemAddedListener = (OnNewItemAddedListener) activity;
        } catch (ClassCastException e){
    
    
            throw new ClassCastException(activity.toString() + "must implement OnNewItemAddedListener");
        }
    }

ListStoreActivity.javaメインビューをロードしますliststore.xml

2 つのフラグメントListStoreActivityが通信する

onCreate メソッドで ListStoreFragment のインスタンスを取得し、newItemAdded メソッドをオーバーライドしてビジネス ロジックを追加します。

public class ListStoreActivity extends Activity implements OnNewItemAddedListener{
    
    

    private ArrayList<String> data;
    private ArrayAdapter<String> adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.liststore);
        data = new ArrayList<String>();
        // 把data装入adapter中
        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data);
        // ListFragment并不需要再定义一个listview 
        ListStoreFragment listStoreFragment = (ListStoreFragment) getFragmentManager().findFragmentById(R.id.fragment_listview);
        listStoreFragment.setListAdapter(adapter);
    }

    @Override
    public void newItemAdded(String content) {
    
    
        //  复写接口中的方法,业务代码在这里实现
        if(!content.equals("")) {
    
    
            data.add(content);
            adapter.notifyDataSetChanged();
        }
    }
}

この欠点は、結合度が非常に高いことです。

フラグメントとアクティビティ間のいくつかの通信方法

  • アクティビティはそのハンドラーを Fragment に渡します
  • 放送
  • イベントバス
  • インターフェースの定義

上記の方法以外にも、ActivityとFragment間でViewModelを共有することで通信を実現できます。

最後にもう一度シェアします

[Tencent 技術チーム制作] Android をゼロから始めてマスターする、Android Studio インストール チュートリアル + Android 基本チュートリアルのフルセット

Androidプログラミング入門チュートリアル

入門から慣れるまでの Java 言語の基礎

ここに画像の説明を挿入します

Kotlin 言語の基礎から入門まで

ここに画像の説明を挿入します

初心者から使い慣れたものまでの Android テクノロジースタック

ここに画像の説明を挿入します

Android Jetpack についての総合的な学習

ここに画像の説明を挿入します

初心者にとって、Android Studio のインストールは難しいかもしれません。次のビデオを見て、インストール方法と実行方法を段階的に学習できます。

Android Studioのインストールチュートリアル

ここに画像の説明を挿入します

Java の学習段階では、この段階ではビデオ学習に重点を置き、書籍を確認して穴埋めすることで補うことをお勧めします。書籍を中心に学習する場合は、書籍の説明に基づいてコードを入力し、指導ビデオで補足して抜け漏れを確認し、穴埋めすることができます。問題が発生した場合は、Baidu にアクセスすると、初級レベルの問題に遭遇した場合でも、より適切な回答が得られることが多いです。

4 つの主要コンポーネントの使用方法、Service の作成方法、レイアウト方法、簡単なカスタム View、アニメーション、ネットワーク通信、その他の一般的な技術などの基本的な知識を習得する必要があります。

ゼロベースのチュートリアルの完全なセットが用意されています。必要な場合は、以下の QR コードを追加して無料で入手できます。

基本的な Android チュートリアルの完全なセット

ここに画像の説明を挿入します

ここに画像の説明を挿入します

ここに画像の説明を挿入します

ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/Android23333/article/details/132563179