Fragment为不同的屏幕尺寸生成不同的布局(一个小的屏幕布一次只放一个Fragment,大的则可以两个或以上的)
如何使用Fragment
1.继承Fragment
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.ViewGroup;
public class ArticleFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.article_view, container, false);
}
}
2.Fragment的使用
2.1.使用xml布局使用
注:此处省略了layout_height,layout_width,这两个必要的属性
<fragment android:name="com.example.android.fragments.HeadlinesFragment"/>
<fragment android:name="com.example.android.fragments.ArticleFragment"/>
2.2使用java代码实现的-建立灵活动态的UI
- 在activity运行时添加或者移除fragment,必须使用 Fragment创建一个FragmentTransaction对象, FragmentTransaction提供了用来增加、移除、替换以及其它一些操作的APIs。
- 在activity的onCreate()方法中添加初始化fragment(s).
- 运用fragment(特别是那些你在运行时添加的)的一个很重要的规则就是在布局中你必须有一个容器view,fragment的layout将会放在这个view里面。(例如:res/layout/news_articles.xml:FramLayout布局)
4.获取FragmentManager的两种方式:
用Support Library APIs(android.support.v4.app.Fragment)调用 getSupportFragmentManager()方法获取 用android.app.Fragment(对Android 3.0下版本不兼容)调用getFragmentManager()即可.
5.Fragment的事务(添加、替换、)
WhiteFragment whiteFragment =
new WhiteFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().
add(R.id.FramLayout,whiteFragment).
addToBackStack(null).commit();
在res/layout/activity_main.xml布局中添加如下代码
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/FramLayout">
</FrameLayout>
记住当你执行fragment事务的时候,例如移除或者替换,你经常要适当地让用户可以向后导航与”撤销”这次改变。为了让用户向后导航fragment事务,你必须在FragmentTransaction提交前调用addToBackStack(String name)方法。 addToBackStack(String name)方法提供了一个可选的String参数为事务指定了一个唯一的名字。这个名字不是必须的,除非你打算用FragmentManager.BackStackEntry APIs来进行一些高级的fragments操作。
Note:当你移除或者替换一个fragment并把它放入返回栈中时,被移除的fragment的生命周期是stopped(不是destoryed).当用户返回重新恢复这个fragment,它的生命周期是restarts。如果你没把fragment放入返回栈中,那么当他被移除或者替换时,它的生命周期是destoryed。
2.3Fragments之间的交互
- 定义好这些模块化的Fragment,你就可以让他们关联activity,使他们与application的逻辑结合起来,实现全局的复合的UI。
- 通常,你想fragment之间能相互交互,比如基于用户事件改变fragment的内容。所有fragment之间的交互需要通过他们关联的activity,两个fragment之间不应该直接交互。
2.3.1定义接口
为了让fragment与activity交互,你可以在Fragment 类中定义一个接口,并且在activity中实现这个接口。Fragment在他们生命周期的onAttach()方法中获取接口的实现,然后调用接口的方法来与Activity交互。
/**
* A simple {@link Fragment} subclass.
* Activities that contain this fragment must implement the
* to handle interaction events.
* Use the {@link WhiteFragment#newInstance} factory method to
* create an instance of this fragment.
*/
public class WhiteFragment extends Fragment {
...
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
public static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
private TextView textView = null;
private OnFragmentInteractionListener mListener;
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment WhiteFragment.
*/
// TODO: Rename and change types and number of parameters
public static WhiteFragment newInstance(String param1, String param2) {
WhiteFragment fragment = new WhiteFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
private WhiteFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
Log.d(getActivity().getPackageName(),mParam1+"--------"+mParam2);
}
}
// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
textView.setText(this.mParam1+"-----"+this.mParam2);
}
}
// TODO: Get HookMethod from implemented activity
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnFragmentInteractionListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnFragmentInteractionListener");
}
}
/**
* This interface must be implemented by *activities that contain this
* fragment to allow an interaction in this fragment to be communicated
* to the activity and potentially other fragments contained in that
* activity.
* <p/>
* See the Android Training lesson <a href=
* "http://developer.android.com/training/basics/fragments/communicating.html"
* >Communicating with Other Fragments</a> for more information.
*/
public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
public void onFragmentInteraction(Uri uri);
}
}
2.3.2实现接口
public class MainActivity extends ActionBarActivity implements WhiteFragment.OnFragmentInteractionListener{
...
//... 省略非关键代码
@Override
public void onFragmentInteraction(Uri uri) {
Toast.makeText(MainActivity.this,"Test Main Activity can be resolved!",Toast.LENGTH_LONG).show();
}
}
2.3.3传递消息给Fragment
-
宿主activity通过findFragmentById()方法来获取fragment的实例,然后直接调用Fragment的public方法来向fragment传递消息。
-
例如,假设上面所示的activity可能包含另外一个fragment,这个fragment用来展示从上面的回调方法中返回的指定的数据。在这种情况下,activity可以把从回调方法中接收到的信息传递给这个展示数据的Fragment.
public class MainActivity extends ActionBarActivity implements WhiteFragment.OnFragmentInteractionListener{ ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final WhiteFragment whiteFragment =WhiteFragment.newInstance("why i can't get param","what's the fuck parmaB"); FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction().add(R.id.FramLayout,whiteFragment).addToBackStack(null).commit(); //error use way //whiteFragment.setArguments(args); btnNow.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //传参数 whiteFragment.onButtonPressed(new Uri.Builder().path("www.baidu.com").build()); } }); } }
参考文献
[1]Android官方培训课程中文版(v0.9.2).FragmentAndroid