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()); } } }; }