フラグメントロード方式
ロードには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.xml
Framelayout を使用してその位置を占めるなど、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.xml
LinearLayout を使用して 2 つのフラグメントを配置し、それぞれ 2 つの Fragment ファイルを指定し、new_item_fragment.xml
EditText とボタンを並べて配置します。
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 チュートリアルの完全なセット