最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android應(yīng)用開發(fā)中Fragment間通信的實(shí)現(xiàn)教程

 更新時(shí)間:2016年02月25日 17:11:21   作者:陳哈哈  
這篇文章主要介紹了Android應(yīng)用開發(fā)中Fragment間通信的實(shí)現(xiàn)教程,包括接口的定義實(shí)現(xiàn)與Fragment通信的動靜態(tài)加載等,需要的朋友可以參考下

為了重用Fragment UI 組件,在設(shè)計(jì)中你應(yīng)該通過定義每一個(gè)fragemnt自己的layout和行為,讓fragment的自包含和模塊化。一旦你定義了這些可重用的Fragment,你可以通過Activity將它們關(guān)聯(lián)起來并通過程序的邏輯代碼將他們連接起來以實(shí)現(xiàn)整體組合的UI。

你會經(jīng)常想要一個(gè)fragment與另一個(gè)fragment通信,例如基于用戶事件改變fragment中的內(nèi)容。所有fragment質(zhì)檢單額通信都是通過Activity關(guān)聯(lián)起來的。兩個(gè)fragment之間不應(yīng)該直接進(jìn)行通信。

定義接口

為了允許fragment和它的Activity通信,你應(yīng)該fragment類中定義一個(gè)接口并在Activity中實(shí)現(xiàn)它。Fragment在onAttach()回調(diào)函數(shù)中獲取接口的具體實(shí)現(xiàn)的對象。后面,fragment就可以調(diào)用接口中的方法實(shí)現(xiàn)與Activity的通信。

下面是一個(gè)Fragment一Activity通信的例子:

// 用來存放fragment的Activtiy必須實(shí)現(xiàn)這個(gè)接口
  public interface OnHeadlineSelectedListener {
    public void onArticleSelected(int position);
  }

 @Override
  public void onAttach(Activity activity) {
    super.onAttach(activity);

    // 這是為了保證Activity容器實(shí)現(xiàn)了用以回調(diào)的接口。如果沒有,它會拋出一個(gè)異常。
    try {
      mCallback = (OnHeadlineSelectedListener) activity;
    } catch (ClassCastException e) {
      throw new ClassCastException(activity.toString()
          + " must implement OnHeadlineSelectedListener");
    }
  }

現(xiàn)在fragment可以通過使用實(shí)現(xiàn)了OnHeadlineSelectedListener接口的mCallback實(shí)例調(diào)用onArticleSelected()方法(或其他在接口中的方法)將消息傳遞給Activity。

例如下面在fragment中的方法將會在用戶點(diǎn)擊一個(gè)List item的時(shí)候被調(diào)用。這個(gè)fragment使用回調(diào)接口將時(shí)間傳遞給父Activtity。

@Override
  public void onListItemClick(ListView l, View v, int position, long id) {
    // 發(fā)送時(shí)間給Activity宿主
    mCallback.onArticleSelected(position);
  }


實(shí)現(xiàn)接口

為了接收從fragment傳遞過來的事件回調(diào),宿主Activity必須實(shí)現(xiàn)定義在fragment類中的接口。

例如,下面的activity實(shí)現(xiàn)了上個(gè)例子中的接口。

public static class MainActivity extends Activity
    implements HeadlinesFragment.OnHeadlineSelectedListener{
  ...
  
  public void onArticleSelected(int position) {
    // 用戶選擇了HeadlinesFragment中的頭標(biāo)題后
    // 做一些業(yè)務(wù)操作
  }
}

將消息傳遞給fragment

宿主Activity可以通過調(diào)用findFragmentById()方法獲取Fragment實(shí)例,然后直接調(diào)用Fragment的公有方法,將消息傳遞給Fragment。

例如,想象一下,之前講過的Activity可能包含有其他的fragment,而這些fragment通過上面的回調(diào)函數(shù)返回的接口動態(tài)地顯示一些內(nèi)容。這種情況下,Activity可以將回調(diào)函數(shù)中接收到信息傳遞給需要的fragment。

public static class MainActivity extends Activity
    implements HeadlinesFragment.OnHeadlineSelectedListener{
  ...

  public void onArticleSelected(int position) {
    // 用戶選中HeadlinesFragment中的頭標(biāo)題后
    // 做一些必要的業(yè)務(wù)操作

    ArticleFragment articleFrag = (ArticleFragment)
        getSupportFragmentManager().findFragmentById(R.id.article_fragment);

    if (articleFrag != null) {
      // 如果 article frag 不為空,那么我們在同時(shí)顯示兩個(gè)fragmnet的布局中...

      // 調(diào)用ArticleFragment中的方法去更新它的內(nèi)容
      articleFrag.updateArticleView(position);
    } else {
      // 否則,我們就是在僅包含一個(gè)fragment的布局中并需要交換fragment...

      // 創(chuàng)建fragment并給他一個(gè)跟選中的文章有關(guān)的參數(shù)
      ArticleFragment newFragment = new ArticleFragment();
      Bundle args = new Bundle();
      args.putInt(ArticleFragment.ARG_POSITION, position);
      newFragment.setArguments(args);
    
      FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

      // 用這個(gè)fragment替換任何在fragment_container中的東西
      // 并添加事務(wù)到back stack中以便用戶可以回退到之前的狀態(tài)
      transaction.replace(R.id.fragment_container, newFragment);
      transaction.addToBackStack(null);

      // 提交事務(wù)
      transaction.commit();
    }
  }
}



動態(tài)加載的Fragment通信
fragment之間永遠(yuǎn)不能通信都是通過他們所依附的Activity來通信的,通過接口回調(diào)的方式來通信
Activity--->Fragment:在activity中創(chuàng)建Bundle數(shù)據(jù)包,并調(diào)用fragment的setArguments(Bundle bundle)方法

fragment--->Activity:在fragment類中定義一個(gè)接口,并在他所屬的activity中實(shí)現(xiàn)該接口,fragment在他的onAttach()方法執(zhí)行期間捕獲該接口的實(shí)現(xiàn),然后就可以調(diào)用該接口方法,以便跟activity通信。

下面的代碼實(shí)現(xiàn)了在一個(gè)Activity下有兩個(gè)Fragment,在一個(gè)Fragment中輸入值在另一個(gè)Fragment顯示

public class MainActivity extends Activity implements MyListener {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    FragmentManager manager = getFragmentManager();
    FragmentTransaction fragmentTransaction = manager.beginTransaction();
    Fragment1 fragment1 = new Fragment1();
    fragmentTransaction.add(R.id.layout1, fragment1);
    fragmentTransaction.commit();

  }
    //在mainActivity中實(shí)現(xiàn)MyListener接口并實(shí)現(xiàn)它未實(shí)現(xiàn)的方法,在該方法中傳遞數(shù)據(jù)
  @Override
  public void send(String info) {
    Toast.makeText(this, "Activity成功接收" + info, 0).show();    
    Fragment2 fragment2 = new Fragment2();
    Bundle bundle = new Bundle();
    bundle.putString("name", info);
    fragment2.setArguments(bundle);
    FragmentManager manager = getFragmentManager();
    FragmentTransaction fragmentTransaction = manager.beginTransaction();
    //替換該Fragment        
    fragmentTransaction.replace(R.id.layout2, fragment2, "fragment2");

    fragmentTransaction.commit();
  }

}

上面的MainActivity布局就是添加兩個(gè)Linearlayout,下面是創(chuàng)建兩個(gè)Fragment,F(xiàn)ragment1的布局就是一個(gè)EditText一個(gè)Button,F(xiàn)ragment2的布局就是一個(gè)TextView。

 public class Fragment1 extends Fragment {
  EditText et;
  Button enter;
  private String info;
  @Override
  public void onAttach(Activity activity) {
    listener = (MyListener) activity;
    super.onAttach(activity);
  }
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
      Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment1_lay,container, false);
    et = (EditText) view.findViewById(R.id.et);
    enter = (Button) view.findViewById(R.id.enter);
    enter.setOnClickListener(new OnClickListener() {

      @Override
      public void onClick(View v) {
        info = et.getText().toString();
        listener.send(info);

      }
    });
    return view;
  }
  public MyListener listener;
    //定義一個(gè)接口
  public interface MyListener{ 
    public void send(String info);
  }

}
public class Fragment2 extends Fragment {

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
      Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment2_lay,container, false);
    TextView tv = (TextView) view.findViewById(R.id.tv);
    tv.setText(getArguments().get("name")+"");//獲取傳遞的值
    Toast.makeText(getActivity(), "fragment"+getArguments().get("name")+"", 0).show();
    return view;
  }

}


靜態(tài)加載的fragment通信
fragment可以調(diào)用getActivity()方法獲取他所在的Activity
Activity可以調(diào)用FragmentManager的findFragmentById()或findFragmentByTag()方法獲取Fragment
如果是靜態(tài)加載的Fragmentn那么向Activity傳遞數(shù)據(jù)就很簡單了,在MainActivity的onCreate方法中:

FragmentManager fragmentManager = getFragmentManager();
Fragment fragment = fragmentManager.findFragmentById(R.id.frag);//靜態(tài)加載在Activity布局中設(shè)置的Fragment的ID
MyFragment frag = (MyFragment) fragment;
frag.setText1("fragment靜態(tài)傳值");

在Fragment類中設(shè)置它的get、set方法,

private String text1;
  public String getText1() {
    return text1;
  }
  public void setText1(String text1) {
    this.text1 = text1;
  }

下面直接調(diào)用就可以了:

     String value = getText1();

相關(guān)文章

  • Android實(shí)現(xiàn)的RecyclerView適配器

    Android實(shí)現(xiàn)的RecyclerView適配器

    這篇文章主要介紹了Android實(shí)現(xiàn)的RecyclerView適配器的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下
    2021-03-03
  • Kotlin協(xié)程Context應(yīng)用使用示例詳解

    Kotlin協(xié)程Context應(yīng)用使用示例詳解

    這篇文章主要為大家介紹了Kotlin協(xié)程Context應(yīng)用使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Android實(shí)現(xiàn)調(diào)用震動的方法

    Android實(shí)現(xiàn)調(diào)用震動的方法

    這篇文章主要介紹了Android實(shí)現(xiàn)調(diào)用震動的方法,實(shí)例分析了Android中Vibrator類的調(diào)用與使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • JankMan-極致的卡頓分析系統(tǒng)

    JankMan-極致的卡頓分析系統(tǒng)

    這篇文章主要為大家介紹了JankMan-極致的卡頓分析系統(tǒng)使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Android 實(shí)現(xiàn)懸浮窗功能

    Android 實(shí)現(xiàn)懸浮窗功能

    這篇文章主要介紹了Android 實(shí)現(xiàn)懸浮窗功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • android 6.0 寫入SD卡的權(quán)限申請實(shí)例講解

    android 6.0 寫入SD卡的權(quán)限申請實(shí)例講解

    今天小編就為大家分享一篇android 6.0 寫入SD卡的權(quán)限申請實(shí)例講解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • Android UI設(shè)計(jì)系列之自定義Dialog實(shí)現(xiàn)各種風(fēng)格的對話框效果(7)

    Android UI設(shè)計(jì)系列之自定義Dialog實(shí)現(xiàn)各種風(fēng)格的對話框效果(7)

    這篇文章主要介紹了Android UI設(shè)計(jì)系列之自定義Dialog實(shí)現(xiàn)各種風(fēng)格的對話框效果,具有一定的實(shí)用性和參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • android編程實(shí)現(xiàn)電話錄音的方法

    android編程實(shí)現(xiàn)電話錄音的方法

    這篇文章主要介紹了android編程實(shí)現(xiàn)電話錄音的方法,涉及Android監(jiān)聽電話通話及音頻采集的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-10-10
  • Android?Activity啟動流程刨析

    Android?Activity啟動流程刨析

    Activity作為Android四大組件之一,他的啟動絕對沒有那么簡單。這里涉及到了系統(tǒng)服務(wù)進(jìn)程,啟動過程細(xì)節(jié)很多,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值
    2022-08-08
  • 分析Android Choreographer源碼

    分析Android Choreographer源碼

    Choreographer的作用主要是配合Vsync,給上層App的渲染提供一個(gè)穩(wěn)定的Message處理的時(shí)機(jī),也就是Vsync到來的時(shí)候,系統(tǒng)通過對Vsync信號周期的調(diào)整,來控制每一幀繪制操作的時(shí)機(jī)
    2021-06-06

最新評論

郎溪县| 准格尔旗| 常山县| 德昌县| 滦平县| 肇源县| 陕西省| 宝应县| 三门峡市| 邵阳市| 团风县| 都昌县| 衡阳县| 万盛区| 射洪县| 石棉县| 鄂州市| 樟树市| 冷水江市| 莱西市| 蒙自县| 南岸区| 丰县| 东乡县| 岢岚县| 德钦县| 扬中市| 泽库县| 新安县| 双江| 清新县| 塘沽区| 隆回县| 南开区| 苍山县| 文安县| 通山县| 澜沧| 无为县| 沿河| 双鸭山市|