目錄
- Activity與Fragment的通信
- (1)原生方案1:Bundle,
- 具體細節在代碼中呈現
- (2)方案2:Java語言中類與類自己通信常用方案:介面
- (3)方案3:第三方架構
Activity與Fragment是兩個獨立類,負責UI的展示,那他們如何進行通信呢?
Activity與Fragment的通信
(1)原生方案1:Bundle,
可以理解為通信時使用的通用工具,可以保存資料的獨立的類,
在 安卓APP_ Fragment(1) 篇章的基礎上,沿用原來的例子,演示在動態添加fragment下,Activity如何向Fragment發送資訊,下圖的my name is zhua字串是從Activity中向fragment傳遞的資訊,fragment收到后并列印出來,

具體實作:
(1)在MainActivity中bundle物件的創建并且與fragment系結
在對應的fragment.java中使用并列印

進階題外話:如何傳輸javaBean?不能直接傳,但是可以把Bean變成某一個key,
這個key對應的是parcelable,parcelable就可以攜帶javaBean
具體細節在代碼中呈現
activity_main.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">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btn_1"
android:text="@string/change"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btn_2"
android:text="@string/replace"/>
<!-- 除去按鈕,剩余的空間都是FrameLayout-->
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/fm"
android:background="@color/teal_200"/>
</LinearLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button1 = findViewById(R.id.btn_1);
button1.setOnClickListener(this);
Button button2 = findViewById(R.id.btn_2);
button2.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_1:
Bundle bundle = new Bundle();
//將Activity中的資訊放進bundle
bundle.putString("message", "my name is zhua");
//需要實體化一個BlankFragment1物件bf
BlankFragment1 bf = new BlankFragment1();
//資料傳入bf中
bf.setArguments(bundle);
//動態切換fragment
replaceFragment(bf);
break;
case R.id.btn_2:
replaceFragment(new ItemFragment());
}
}
//完成動態切換fragment
private void replaceFragment(Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.fm, fragment);
transaction.commit();
}
}
BlankFragment.java
public class BlankFragment1 extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//這個getArguments回傳的是在MainActivity中傳入的bundle
Bundle bundle = this.getArguments();
//獲取bundle里面保存的內容
String string = bundle.getString("message");
//在fragment中列印從Activity中傳遞來的資訊
Log.e("zhua", "onCreate: "+string);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_blank1, container, false);
}
}
flagment_blank1.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".BlankFragment1">
<!-- TODO: Update blank fragment layout -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffff00"
android:textSize="40dp"
android:text="@string/hello_blank_fragment" />
</FrameLayout>
(2)方案2:Java語言中類與類自己通信常用方案:介面
面向介面編程:用介面實作兩者的通信,訊息互傳,(從老師的描述中可以發現不好用,先不學,不學了,)
(3)方案3:第三方架構
當Activity發送訊息的時候,Fragment根據需要(對Activity這個訊息“感不感興趣”),選擇接識訓是不接受,
要用到其他的通信方案,即編譯器已經封裝好的介面,如eventBus,LiveData…
在這樣的方案里面包含了一個設計模式,叫觀察者模式(或者叫發布訂閱模式),比如我Fragment作為資訊的接收方,當Activity資訊發生變化的且是我需要的時候,我就會收錄這個資訊,
進階內容,后續再做補充,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/277358.html
標籤:其他
