(7)Fragment與Activity通訊(二)
阿新 • • 發佈:2019-02-10
1.歸納
Fragment的使用場景
在沒有Fragment的時候,基本上是一個介面就要新建一個Activity,有了Fragment,就可以使用單個Activity+多個Fragment的方式,可以減少記憶體消耗,提升效能,且介面顯示更靈活。
對於不同介面間有密切的邏輯關係,且介面相似的場景,可以採用單個Activity+多個Fragment的方式,如:
APP的主頁面,點選不同的TAB按鈕,顯示不同的介面。
使用者的登入註冊模組通常包括三個介面:登入、註冊和修改密碼,這三個介面的實現。
先展示列表,點選列表項,顯示詳情這樣的兩個介面的實現,像訂單列表和訂單詳情介面。
使用setArguments(Bundle bundle)傳遞引數
傳參步驟歸納:
- 在Fragment中定義一個靜態方法,供Activity例項化Fragment並傳參時呼叫;
- 在Activity中,呼叫步驟1中新建的靜態方法建立一個Fragment例項,並傳入需要傳遞的引數
- 在Fragment中的onCreateView(或者onCreate)方法中通過getArguments()方法取值
2.一個小例子
ContentFragmentActivitypackage com.xzy.fragmentbasicdemo.fragment; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.xzy.fragmentbasicdemo.R; /** * A simple {@link Fragment} subclass. */ public class ContentFragment extends Fragment { private static final String TAG = "ContentFragment"; public static final String ARGUMENT = "argument"; public static final String RESPONSE = "response"; private String mArguments; public ContentFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_content, container, false); /** * 取值 * */ Bundle bundle = getArguments(); if (bundle != null) { mArguments = bundle.getString(ARGUMENT); } /** * 賦值 * */ TextView textView = view.findViewById(R.id.tv_test); textView.setText(mArguments); return view; } /** * 例項化並傳值 * * @param param 需要傳遞的引數 * @return ContentFragment */ public static ContentFragment newInstance(String param) { Bundle bundle = new Bundle(); bundle.putString(ARGUMENT, param); ContentFragment contentFragment = new ContentFragment(); contentFragment.setArguments(bundle); return contentFragment; } }
package com.xzy.fragmentbasicdemo; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import com.xzy.fragmentbasicdemo.fragment.ContentFragment; /** * 測試fragment的一些用法: * 1.傳參 */ public class MainActivity extends FragmentActivity { private ContentFragment mContentFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FragmentManager fm = getSupportFragmentManager(); /** * 在activity_main的根佈局新增ID屬性,值為id_fragment_container * */ mContentFragment = (ContentFragment) fm.findFragmentById(R.id.id_fragment_container); if (mContentFragment == null) { /** * 例項化並傳值 * */ mContentFragment = ContentFragment.newInstance("xuzhuyun"); fm.beginTransaction().replace(R.id.id_fragment_container, mContentFragment).commit(); } } }
3.參考文章
- http://blog.csdn.net/xjbclz/article/details/51842328
- http://blog.csdn.net/tu_bingbing/article/details/24143249
- http://blog.csdn.net/vrinux/article/details/44086649