国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

Android中Fragment的加載方式與數(shù)據(jù)通信詳解

2019-12-12 03:17:50
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

一、加載方式

1. 靜態(tài)加載

1.1 加載步驟

(1) 創(chuàng)建fragment:創(chuàng)建自定義Fragment類(lèi)繼承自Fragment類(lèi),同時(shí)將自定義Fragment類(lèi)與Fragment視圖綁定(將layout轉(zhuǎn)換成View)

View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)

inflater用于綁定Fragment的布局文件,同時(shí)將該布局轉(zhuǎn)換成View對(duì)象并返回;container為Fragment的UI所在的父容器。返回值為Fragment顯示的UI,若不顯示,則返回null。

inflate(int resource, ViewGroup root, boolean attachToRoot)

resource為Fragment需要加載的布局文件;root為加載Fragment的父ViewGroup,也就是onCreateView傳遞進(jìn)來(lái)的container;attachToRoot為是否返回父ViewGroup。

(2) 使用fragment:在父視圖中引入fragment,靜態(tài)加載必須指定name屬性以及一個(gè)唯一標(biāo)識(shí)符,標(biāo)識(shí)符可以為id或者tag

<!--指定在layout中實(shí)例化的Fragment類(lèi),需要為“包名.類(lèi)名”的完整形式-->android:name<!--唯一標(biāo)識(shí),id和tag可任選其一,不可兩者都沒(méi)有-->android:idandroid:tag

(3) 監(jiān)聽(tīng)事件:若在父視圖對(duì)應(yīng)的類(lèi)中設(shè)置監(jiān)聽(tīng)事件,可以直接訪問(wèn)fragment中的子組件;若在Fragment的類(lèi)中設(shè)置,則必須通過(guò)inflate()返回的View對(duì)象訪問(wèn)Fragment中的子組件(view.findViewById(id))。

1.2 簡(jiǎn)單范例

MyFragment視圖:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/fragment_text" android:layout_width="wrap_content" android:layout_height="wrap_content" /></LinearLayout>

MyFragment類(lèi):

public class MyFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //將layout布局轉(zhuǎn)換成View對(duì)象 View view = inflater.inflate(R.layout.myfragment, container, false); //必須通過(guò)view對(duì)象對(duì)其子組件進(jìn)行訪問(wèn) TextView textView = (TextView) view.findViewById(R.id.fragment_text); textView.setText("這里是fragment"); //返回Fragment顯示UI return view; }}

引用fragment的父視圖:

<?xml version="1.0" encoding="utf-8"?><LinearLayout 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="com.studying.StaticFragmentActivity"> <fragment android:tag="fragment"android:name="com.joahyau.studying.MyFragment" android:layout_width="wrap_content" android:layout_height="wrap_content"/></LinearLayout>

父視圖對(duì)應(yīng)的類(lèi)設(shè)置事件監(jiān)聽(tīng):

public class StaticFragmentActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_static_fragment); //可直接通過(guò)findViewById訪問(wèn) findViewById(R.id.fragment_text).setOnClickListener(new View.OnClickListener() {  @Override  public void onClick(View v) {  Toast.makeText(StaticFragmentActivity.this, "點(diǎn)擊了文本", Toast.LENGTH_SHORT).show();  } }); }}

2. 動(dòng)態(tài)加載

2.1 加載步驟

(1) 獲取事務(wù)管理器:對(duì)Fragment進(jìn)行的添加、移除、替換等操作,均為事務(wù)。需通過(guò)以下代碼獲取事務(wù)管理器,從而對(duì)fragment進(jìn)行動(dòng)態(tài)操作。

FragmentManager fm = getFragmentManager();FragmentTransaction ft = fm.beginTransaction();

(2) 創(chuàng)建Fragment對(duì)象:創(chuàng)建需要加載的fragment,而后通過(guò)add或replace等方法實(shí)現(xiàn)動(dòng)態(tài)加載。

2.2 簡(jiǎn)單范例

布局:

<?xml version="1.0" encoding="utf-8"?><LinearLayout 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" android:orientation="vertical"tools:context="io.github.joahyau.studying.DynamicFragmentActivity"> <Button android:id="@+id/load" android:text="加載" android:layout_width="match_parent" android:layout_height="80dp" /> <LinearLayout android:id="@+id/container" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" /></LinearLayout>

Java:

public class DynamicFragmentActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_dynamic_fragment); findViewById(R.id.load).setOnClickListener(new View.OnClickListener() {  @Override  public void onClick(View v) {  //獲取事務(wù)管理器  FragmentManager fragmentManager = getFragmentManager();  FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();  //創(chuàng)建fragment,并將其動(dòng)態(tài)加載到id位container的布局中  MyFragment myFragment = new MyFragment();  fragmentTransaction.add(R.id.container, myFragment);  //提交事務(wù)  fragmentTransaction.commit();  } }); }}

二、數(shù)據(jù)通信

3. Activity向Fragment傳遞數(shù)據(jù)

3.1 Activity向動(dòng)態(tài)加載的Fragment傳遞數(shù)據(jù)

(1)在Activity中獲取Fragment對(duì)象;

(2)創(chuàng)建Bundle對(duì)象并傳入數(shù)據(jù);

(3)將Bundle對(duì)象傳遞給Fragment對(duì)象;

(4)在Fragment中獲取Bundle對(duì)象并拆包得到數(shù)據(jù)。

范例:Activity中只有一個(gè)id為send的Button,MyFragment中只有一個(gè)TextView,這里就不再放布局代碼了。

Activity:

public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.send).setOnClickListener(new View.OnClickListener() {  @Override  public void onClick(View v) {  //創(chuàng)建Fragment對(duì)象  MyFragment myFragment = new MyFragment();  //創(chuàng)建Bundle對(duì)象并傳入數(shù)據(jù)  Bundle bundle = new Bundle();  bundle.putString("info", "這里是向Fragment傳遞的數(shù)據(jù)");  myFragment.setArguments(bundle);  //加載Fragment  FragmentManager fragmentManager = getFragmentManager();  FragmentTransaction beginTransaction = fragmentManager.beginTransaction();  beginTransaction.add(R.id.layout, myFragment, "myfragment");  beginTransaction.commit();  } }); }}

Fragment:

public class MyFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.my_fragment, container, false); TextView tv = (TextView) view.findViewById(R.id.text); //獲取數(shù)據(jù) String text = getArguments().get("info") + ""; tv.setText(text); return view; }}

3.2 Activity向靜態(tài)加載的Fragment傳遞數(shù)據(jù)

(1)在Fragment中創(chuàng)建作為容器的數(shù)據(jù)對(duì)象,并創(chuàng)建getter和setter;

(2)在Activity中獲取FragmentManager;

(3)通過(guò)事務(wù)管理器的findFragmentById或findFragmentByTag方法,獲得fragment對(duì)象;

(4)通過(guò)獲得的fragment對(duì)象調(diào)用容器的setter方法進(jìn)行傳值。

范例:這里的布局與動(dòng)態(tài)加載的布局唯一不同的就是將send按鈕放在了Fragment里面,其它相同。

Fragment:

public class MyFragment extends Fragment { private Button btn; private String received;//作為容器的對(duì)象 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.my_fragment, container, false); TextView tv = (TextView) view.findViewById(R.id.text); tv.setText("這里是Fragment"); btn = (Button) view.findViewById(R.id.send); btn.setOnClickListener(new View.OnClickListener() {  @Override  public void onClick(View v) {  Toast.makeText(getActivity(), "成功接收/"" + getReceived() + "/"", Toast.LENGTH_SHORT).show();  } }); return view; } public String getReceived() { return received; } public void setReceived(String received) { this.received = received; }}

Activity:

public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FragmentManager fragmentManager = getFragmentManager(); MyFragment myFragment = (MyFragment) fragmentManager.findFragmentById(R.id.my_fragment); myFragment.setReceived("this is a test."); }}

4. Fragment向Activity傳遞數(shù)據(jù)

(1)在Fragment中寫(xiě)一個(gè)回調(diào)接口;

(2)在activity中實(shí)現(xiàn)這個(gè)回調(diào)接口,實(shí)現(xiàn)的函數(shù)用于傳值;

(3)重寫(xiě)Fragment中onAttach,在其中創(chuàng)建一個(gè)接口對(duì)象,得到傳遞過(guò)來(lái)的activity(我的理解是這個(gè)接口其實(shí)相當(dāng)于傳遞過(guò)來(lái)的activity的一個(gè)父類(lèi),這一步是用到了多態(tài)的特性);

(4)用得到的接口對(duì)象進(jìn)行傳值。

Fragment:

public class MyFragment extends Fragment { private SendData sendData; @Override public void onAttach(Activity activity) { super.onAttach(activity); //獲取實(shí)現(xiàn)的接口對(duì)象 sendData = (SendData) activity; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.my_fragment, container, false); TextView tv = (TextView) view.findViewById(R.id.text); tv.setText("這里是Fragment"); //通過(guò)接口對(duì)象傳遞數(shù)據(jù) sendData.sendMsg("this is a test."); return view; } //定義一個(gè)回調(diào)接口 public interface SendData{ void sendMsg(String str); }}

Activity:

public class MainActivity extends Activity implements MyFragment.SendData{ private Button btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn = (Button) findViewById(R.id.send); btn.setOnClickListener(new View.OnClickListener() {  @Override  public void onClick(View v) {  MyFragment myFragment = new MyFragment();  FragmentManager fragmentManager = getFragmentManager();  FragmentTransaction beginTransaction = fragmentManager.beginTransaction();  beginTransaction.add(R.id.layout, myFragment);  beginTransaction.commit();  } }); } //實(shí)現(xiàn)SendData接口,接收數(shù)據(jù) @Override public void sendMsg(String str) { Toast.makeText(this, "成功接收/"" + str + "/"", Toast.LENGTH_SHORT).show(); }}

以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持武林網(wǎng)!

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 高台县| 揭阳市| 嘉荫县| 叶城县| 临海市| 玉龙| 微山县| 社会| 安福县| 广河县| 临颍县| 平安县| 镇康县| 衡阳县| 临沭县| 灵山县| 昭平县| 将乐县| 长武县| 清丰县| 裕民县| 邳州市| 印江| 靖宇县| 烟台市| 禄丰县| 泾源县| 开鲁县| 青川县| 昭觉县| 阿图什市| 时尚| 射洪县| 屏山县| 松滋市| 阜城县| 本溪市| 铜梁县| 青海省| 洮南市| 抚远县|