Fragment與Activity傳遞參數

1、Activity <--->   Fragment  Activity一般先傳遞給FragmentActivity,通過FAct傳給附屬Fragment

2、Activity <--->   FragmentActivity  通過Intent傳遞  如果涉及加載模式傳遞參數的話,需要通過 onNewIntent(Intent intent) 獲取intent, getIntent()已經被onNewIntent()攔截

3、Fragment <--->   Fragemt Fragment之間相互切換通過bundle,setArguments傳遞數據

4、FragmentActivity <--->   Fragment 通過接口傳遞數據,因爲Arguments在一開始創建Fragment就必須傳進去,要是再次設置報

java.lang.IllegalStateException: Fragment already active 異常

12-19 10:28:01.393: E/AndroidRuntime(25224): java.lang.IllegalStateException: Fragment already active
12-19 10:28:01.393: E/AndroidRuntime(25224): at android.support.v4.app.Fragment.setArguments(Fragment.java:530)
12-19 10:28:01.393: E/AndroidRuntime(25224): at com.pupuwang.sjzx.fragment.HomeFragment.setArguments(HomeFragment.java:198)
12-19 10:28:01.393: E/AndroidRuntime(25224): at com.pupuwang.sjzx.fragment.FragmentMainActivity.setFragmentIndicator(FragmentMainActivity.java:46)
12-19 10:28:01.393: E/AndroidRuntime(25224): at com.pupuwang.sjzx.fragment.FragmentMainActivity.onNewIntent(FragmentMainActivity.java:77)
12-19 10:28:01.393: E/AndroidRuntime(25224): at android.app.Instrumentation.callActivityOnNewIntent(Instrumentation.java:1156)
12-19 10:28:01.393: E/AndroidRuntime(25224): at android.app.ActivityThread.deliverNewIntents(ActivityThread.java:2454)
12-19 10:28:01.393: E/AndroidRuntime(25224): at android.app.ActivityThread.performNewIntents(ActivityThread.java:2467)
12-19 10:28:01.393: E/AndroidRuntime(25224): at android.app.ActivityThread.handleNewIntent(ActivityThread.java:2476)
12-19 10:28:01.393: E/AndroidRuntime(25224): at android.app.ActivityThread.access$1400(ActivityThread.java:157)
12-19 10:28:01.393: E/AndroidRuntime(25224): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1412)
12-19 10:28:01.393: E/AndroidRuntime(25224): at android.os.Handler.dispatchMessage(Handler.java:99)
12-19 10:28:01.393: E/AndroidRuntime(25224): at android.os.Looper.loop(Looper.java:153)
12-19 10:28:01.393: E/AndroidRuntime(25224): at android.app.ActivityThread.main(ActivityThread.java:5326)
12-19 10:28:01.393: E/AndroidRuntime(25224): at java.lang.reflect.Method.invokeNative(Native Method)
12-19 10:28:01.393: E/AndroidRuntime(25224): at java.lang.reflect.Method.invoke(Method.java:511)
12-19 10:28:01.393: E/AndroidRuntime(25224): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:848)
12-19 10:28:01.393: E/AndroidRuntime(25224): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:615)
12-19 10:28:01.393: E/AndroidRuntime(25224): at dalvik.system.NativeStart.main(Native Method)



fragment之間參數傳遞

public static HomeFragment newInstance(int index) {
HomeFragment hf = new HomeFragment();
Bundle bundle = new Bundle();
bundle.putInt("index", index);
hf.setArguments(bundle);
Log.e(TAG, "--------index------:" +index);
return hf;
}
public int getShownIndex() {
Bundle bundle = getArguments();
if(bundle==null){
return -1;
}else{
return bundle.getInt(IntentKeys.SHOP_INFO, 0);
}
}


接口回調傳遞參數

注意要在fragment中的此方法中轉換下

@Override
public void onAttachFragment(Fragment fragment) {
    try {
        if(fragment instanceof IBtnCallListener){
            mbtnListener = (IBtnCallListener) fragment;
        }else if(fragment instanceof IFragmentArguments){
            mIFragArg = (IFragmentArguments)fragment;
        }
    } catch (Exception e) {
        // TODO: handle exception
    }
    super.onAttachFragment(fragment);
}

通過自定義接口回調

public interface IFragmentArguments {
    public void setIArguments(Bundle bundle);
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章