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

  1. 在activity运行时添加或者移除fragment,必须使用 Fragment创建一个FragmentTransaction对象, FragmentTransaction提供了用来增加、移除、替换以及其它一些操作的APIs。
  2. 在activity的onCreate()方法中添加初始化fragment(s).
  3. 运用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