標籤:android style blog io color os 使用 sp on
Fragment 的生命週期是隨著activity變化而變化的。
如果activity要給在啟動並執行時候給fragment傳人資料則需要fragment實現一個自訂的介面,並且實現介面裡面的方法,在activity裡面儲存這個介面並且在需要傳人資料的時候調用這個方法即可。
如果fragment啟動並執行時候需要給activity傳資料了?activity先實現這個介面,然後在fragment裡面重寫onAttach(Activity act)這個方法,並在這個方法裡面講activity強制轉換為介面類,然後在fragment使用的時候調用這個介面類的方法。
請看下面的例子:
activity給fragment裡面傳人資料:
public class MainActivity extends Activity{ private TestFragment fragment;//fragment private UpdateFragment updateFragment;//fragment實現的介面 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_layout); initView(); } private void initView() { FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); fragment = new TestFragment(); updateFragment = fragment; fragmentTransaction.add(R.id.main, fragment); fragmentTransaction.addToBackStack(null); fragmentTransaction.commitAllowingStateLoss(); } @Override protected void onResume() { //改變fragment裡面textView的值 updateFragment.setData("王五"); super.onResume(); }}
介面類
public interface UpdateFragment { void setData(String str);}
Fragment類:
public class TestFragment extends Fragment implements UpdateFragment{ private View view; private TextView txt; public TestFragment() { super(); } @Override public void onAttach(Activity activity) { super.onAttach(activity); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (null == view){ view = inflater.inflate(R.layout.activity_main, container, false); txt = (TextView)view.findViewById(R.id.tv); } return view; } @Override public void setData(String str) { if (null != txt) { txt.setText(str); } }}
Fragment給activity傳入資料demo:
Activity類:
public class MainActivity extends Activity implements UpdateFragment{ private static final String TAG = MainActivity.class.getSimpleName(); private TestFragment fragment;//fragment @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_layout); initView(); } private void initView() { FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); fragment = new TestFragment(); fragmentTransaction.add(R.id.main, fragment); fragmentTransaction.addToBackStack(null); fragmentTransaction.commitAllowingStateLoss(); } @Override protected void onResume() { super.onResume(); } @Override public void setData(String str) { if (null != str ){ Log.d(TAG, "setData:"+str); } }
介面類和上面的是一樣的就不寫了
Fragment類:
public class TestFragment extends Fragment{ private View view; private TextView txt; private Button btn; private UpdateFragment updateFragment; public TestFragment() { super(); } @Override public void onAttach(Activity activity) { try { updateFragment = (UpdateFragment)activity; } catch (Exception e) { e.printStackTrace(); } super.onAttach(activity); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (null == view){ view = inflater.inflate(R.layout.activity_main, container, false); txt = (TextView)view.findViewById(R.id.tv); btn = (Button)view.findViewById(R.id.btn); btn.setOnClickListener(clickListener); } return view; } private OnClickListener clickListener = new OnClickListener() { @Override public void onClick(View v) { if (null != txt) { updateFragment.setData(txt.getText().toString()); } } };}
Android_Fragment和Activity之間的通訊