Fragment
Fragment加载到Activity的两种方式
布局文件加载
设置布局文件
相当于把fragment当成一个View使用
<fragment
android:tag="tag_emotion_fragment"
android:id="@+id/emotion_fragment"
android:name="com.example.carpediem.testkeyboart2.fragment.TestFragment"
android:layout_width="match_parent"
android:layout_height="@dimen/x200"/>
activity代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//在activity中设置一个button,点击事件是隐藏fragment
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//隐藏fragment。可以通过getView获取这个fragment布局文件
mEmotion_fragment.getView().setVisibility(View.GONE);
}
});
//通过FragmentManager查找fragment。从而获取到fragment实例
//还可以通过findFragmentByTag得到fragment
mEmotion_fragment = getSupportFragmentManager().findFragmentById(R.id.emotion_fragment);
//还可以通过fragment获取到布局文件中的控件
Button button_fragment = mEmotion_fragment.getView().findViewById(R.id.button_fragment);
//fragment中的控件设置监听事件
button_fragment.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "fragment按钮", Toast.LENGTH_SHORT).show();
}
});
}
代码动态加载
activity中布局代码
<FrameLayout
android:id="@+id/id_fragment_content"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
activity代码
android.support.v4.app.FragmentManager manager = getSupportFragmentManager();
android.support.v4.app.FragmentTransaction transaction = manager.beginTransaction();
MainFragment mainFragment = MainFragment.newInstance("","");
transaction.replace(R.id.id_fragment_content, mainFragment);
transaction.addToBackStack(null);
transaction.commit();
fragment与activity交互 ##
- fragment中可以getActivity实例,访问activity中所有的public方法
- activity可以通过findFragmentByTag或者findFragmentById获取fragment的实例。
- 可以在创建fragment的时候传递参数
- 还可以在fragment中设置接口回调
代码示例
public class TestFragment extends Fragment {
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private static final String TAG = "fragment_lifecycle";
private String mParam1;
private String mParam2;
private OnFragmentInteractionListener mListener;
public TestFragment() {
// Required empty public constructor
}
public static TestFragment newInstance(String param1, String param2) {
TestFragment fragment = new TestFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_test, container, false);
}
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
}
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
Log.e(TAG, "onAttach: fragment" );
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
Log.e(TAG, "onDetach: fragment" );
mListener = null;
}
public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
void onFragmentInteraction(Uri uri);
}
}
fragment与fragment交互
两个不同宿主的两个fragment之间交互
Fragment中存在startActivityForResult()以及onActivityResult()方法,fragment没有setResult()方法,用于设置返回的intent,这样我们就需要通过调用getActivity().setResult(ListTitleFragment.REQUEST_DETAIL, intent);
同一个宿主的的两个fragment之间交互
fragmentA.setTargetFragment(ContentFragment.this, REQUEST_EVALUATE);
Fragment.setTargetFragment 当前fragment由别的fragment启动,在完成操作后返回数据的
Fragment创建对话框
google推荐,DialogFragment拥有更好的生命周期。可以更好的管理。
没有布局的Fragment的作用
旋转屏幕时候
保存大量数据
FragmentPagerAdapter与FragmentStatePagerAdapter
区别是是否销毁fragment。如果fragment数量过多,使用FragmentStatePagerAdapter。数量较少建议FragmentPagerAdapter
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0605/2996.html