这一节,复习一下Android中碎片化Fragment的基础知识,首先,来看看它的生命周期方法,如下图:
它的生命周期与Activity的生命周期关系非常密切,学习时应该与它结合着看比较好,而且在面试时会经常被问到它们的执行顺序,现在写个Demo来看一看,这里只贴主要的代码,剩下的各生命周期方法自己动手写写。
MainActivity.java代码如下:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FragmentManager fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.add(R.id.fl,new MyFragment()); ft.commit(); System.out.println("MainActvity------->onCreate"); }运行结果如下图:
注:经常会用到Fragment的三个方法:onCreate(),onCreateView(),onPause();
接下来,来看看Fragment之间数据传递的知识,先看一下效果图:
左右两边分别是不同的Fragment,来看看代码:
MainActivity.java代码:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FragmentManager fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); LeftFragment leftFragment = new LeftFragment(); ft.add(R.id.left_frag,leftFragment,"left"); ft.addToBackStack("left"); ft.commit(); } }activity_main:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" tools:context="startimes.com.fragmentssenddatademo.MainActivity"> <LinearLayout android:id="@+id/left_frag" android:layout_width="150dp" android:layout_height="match_parent" android:orientation="vertical" android:weightSum="1"> </LinearLayout> <LinearLayout android:id="@+id/right_frag" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffacacac" android:orientation="vertical" ></LinearLayout> </LinearLayout>LeftFragment.java:
public class LeftFragment extends Fragment { private ArrayAdapter<String> adapter; private List<String> list; private ListView lv; private FragmentManager fm; private FragmentTransaction ft; public LeftFragment() { // Required empty public constructor } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initData(); adapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, list); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_left, container, false); lv = (ListView) view.findViewById(R.id.lv); lv.setAdapter(adapter); adapter.notifyDataSetChanged(); lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { String item = adapter.getItem(position); fm = getFragmentManager(); ft=fm.beginTransaction(); RightFragment rightFragment = new RightFragment(); ft.replace(R.id.right_frag,rightFragment,"right"); ft.addToBackStack("right"); Bundle bundle = new Bundle(); bundle.putString("position",item); rightFragment.setArguments(bundle); ft.commit(); } }); return view; } private void initData() { list = new ArrayList<>(); for(int i=0;i<20;i++){ list.add("提升了"+i); } } @Override public void onPause() { super.onPause(); } }RightFragment.java:
public class RightFragment extends Fragment { private EditText et; public RightFragment() { // Required empty public constructor } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public void onPause() { super.onPause(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_right, container, false); et = (EditText) view.findViewById(R.id.et); String position = getArguments().getString("position"); et.setText("你好,现在"+position); return view; } }注:Fragment的布局代码较简单,这里就不贴了。
最后,来看看有关Fragment独立性的体现,也是传递数据,但通接口来调的,来看看代码:
MainActivity.java:
public class MainActivity extends Activity implements TopsFragment.OnTopButtonClickedListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public void onClick(String name) { BottomsFragment fragment = (BottomsFragment) getFragmentManager().findFragmentByTag("bottom_fragment"); fragment.updateText("onClick:"+name); } }
activity_main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="startimes.com.fragmentcallbackdemo.MainActivity"> <fragment android:name="startimes.com.fragmentcallbackdemo.TopsFragment" android:layout_width="match_parent" android:layout_height="wrap_content" android:tag="top_fragment" /> <fragment android:name="startimes.com.fragmentcallbackdemo.BottomsFragment" android:layout_width="match_parent" android:layout_height="wrap_content" android:tag="bottom_fragment" /> </LinearLayout>TopFragment.java:
public class TopsFragment extends Fragment implements View.OnClickListener { public TopsFragment() { } @Override public void onClick(View view) { if(listener!=null){ listener.onClick("Hello,infomation comes from TopsFragment"); } } private OnTopButtonClickedListener listener; public interface OnTopButtonClickedListener{ public void onClick(String name); } @Override public void onAttach(Activity activity) { if(getActivity() instanceof OnTopButtonClickedListener){ listener= (OnTopButtonClickedListener) getActivity(); } super.onAttach(activity); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_tops, container, false); view.setOnClickListener(this); return view; } }BottomsFragment.java:public class BottomsFragment extends Fragment { public BottomsFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_bottoms, container, false); } public void updateText(String value){ EditText editText= (EditText) getView(); editText.setText(value); } }效果图如下:今天就先复习这些。
![]()