Android Fragment 和 Activity之間的通信剖析(Fragment 三 )


Android 為Fragment 和Activity之間的通信提供了兩種機制


 

機制1:

①Fragment獲取它所在的Activity

調用Fragment的getActivity()方法即可返回它所在的Activity實例,之后我們就能夠通過這個實例調用findViewById(int) 方法了,也就是說,我們能夠在Fragment中得到相關聯的Activity的組件的信息 ,如:

TextView textView = (TextView)getActivity().findViewById(R.id.textView) ;

  之后就能夠獲得TextView中的字符內容

②Activity 獲取它綁定的Fragment

調用Activity關聯的FragmentManager的findFragmentById(int id) 或者findViewByTag(String tag)方法,即可獲得指定的Fragment對象,獲得這個Fragment對象之后,我們就能夠調用中這個對象的getView()方法,這個方法返回的是OnCreate()方法中返回的那個View , 也就是Fragment的布局View,這樣就能夠操作Fragment中的組件了

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
View view = fragment.getView() ;
TextView textView = (TextView)findViewById(R.id.textView);

③引申
我們想既然通過①②的方法能夠返回Activity和Fragment實例對象,那么我們就能夠在Fragment和Activity之間進行實時的通信,

我們想如果我們如下的一個Activity子類 ;

public class MainActivity extends Activity { public void show(String text ) { .......具體的操作......... } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

................................................ } }

如果這個Activity 中添加了一個Fragment對象的話,那么我們就能夠在這個Fragment類中的某個方法中使用下面的的代碼:

((MainActivity)getActivity()).show("you are right") ;//注意使用強制類型轉換,要不不行

也就是說,我們能夠在Fragment中直接調用Activity中的方法,這就非常的有用了,你想如果Fragment中的某個信息想要實時的傳給Activity,那么就可以在這個信息需要傳遞的時候將這個信息作為參數調用Activity中的方法,將這個信息傳給Activity ; 同理由於Activity能夠返回Fragment,那么也就能夠調用Fragment中的任意的方法,實現Activity到Fragment的實時通信

④Fragment和Fragment之間的通信

由於一個Activity之中能夠同時加載多個Fragment,那么就會存在Fragment和Fragment之間的通信問題

既然Fragment和Activity之間的通信問題解決了,那Fragment與Fragment之間的通信也沒有那么復雜。基本思路是:

首先在一個Fragment中可以得到與它相關聯的Activity,然后再通過這個Activity去獲取另外一個Fragment的實例,這樣就實現了不同Fragment之間的通信。

 

機制2 :

①Activity向Fragment中傳遞數據

在Activity中創建Bundle數據包,並調用Fragment對象的setArguments(Bundle bundle)方法

(也就是說我們得要首先創建一個Fragment對象之后才能夠用這個對象調用setArgument(Bundle)方法)即可將Bundle數據包傳遞給該Fragment對象;之后在Fragment類中調用getArguments()方法就能夠獲得這個Bundle包

這個方法一般用在Activity加載一個Fragment的時候,由於當我們加載一個Fragment的時候就想要將一些數據傳給Fragment對象,來對Fragment對象進行初始化,所以在Fragment中的onCreate()或者onCreateView()方法中調用getArgument()方法來獲得這個Bundle對象,

②Fragment實時的向Activity通信

實際就是使用接口回調的機制,也就是在Fragment中定義一個內部回調接口,再讓包含該Fragment的Activity類實現這個接口,這樣Fragment就能夠調用這個回調方法,將數據傳給Activity中

 

public class MyFragment extends Fragment
{
    private Callbacks mCallbacks;
    // 定義一個回調接口,該Fragment所在Activity需要實現該接口
    // 該Fragment將通過該接口與它所在的Activity交互
    public interface Callbacks
    {
//回調方法
public void onItemSelected(參數); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
} // 當該Fragment被添加、顯示到Activity時,回調該方法 @Override public void onAttach(Activity activity) { super.onAttach(activity); // 如果Activity沒有實現Callbacks接口,拋出異常 if (!(activity instanceof Callbacks)) { throw new IllegalStateException( "Fragment所在的Activity必須實現Callbacks接口!"); } // 把該Activity當成Callbacks對象 mCallbacks = (Callbacks)activity; } // 當該Fragment從它所屬的Activity中被刪除時回調該方法 @Override public void onDetach() { super.onDetach(); // 將mCallbacks賦為null。 mCallbacks = null; }

@Override
public View OnCreateView()
{
....................
}

.......一定的時機...........
//調用回調方法
mCallbacks.onItemSelected(數據); }
public class MyActivity extends Activity implements MyFragment.Callbacks { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);  setContentView(R.layout.activity_book_twopane); } // 實現Callbacks接口必須實現的方法  @Override public void onItemSelected(參數 data) { data中就是Fragment傳來的數據
} }

不同的Activity可以同時實現這個Fragment中的接口和接口中的方法
但是實現方式可以不同,這樣的話,我們就能夠在多個Activity之間重用這個Fragment的時候,卻有不同的Activity效果了
 
        


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM