Android Fragment 使用如果使用android.support.v4.app.Fragment;
可以兼容到android版本1.6
为了配合android.support.v4.app.Fragment 请Activity继承FragmentActivity 否则会报错的
//官方文档介绍
FragmentActivity is a special activity provided in the Support Library to handle fragments on system versions older than API level 11
使用这个包,android.app.Fragment你的android api版本必须高于 11
可以继承普通的Activity。
如果你的Activity继承AppComactActivity
使用android.support.v4.app.Fragment不需要再继承FragmentActivity了
记得主题一定要换成Thrme.AppCompat....
最简单使用Fragment的方法:
1.实现Fragment布局文件 fragment_text.xml
xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="this is a fragment"
/>
LinearLayout>
2.实现Fragment类
public class TextFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_text,container,false);
}
}
3.在Acvivity布局文件中加入fragment
<fragment android:name="com.gac.fragmentdemo.TextFragment"
android:id="@+id/id_textfragment"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
/>
4.实现Activity类
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
动态添加fragment 或者切换不同的fragment
在activity布局文件中添加一个容器布局文件
<FrameLayout
android:id="@+id/id_fragment_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>FrameLayout>
在actvity中//动态添加Fragment
public void addFragment(){
OneFragment fragment = new OneFragment();
getSupportFragmentManager().beginTransaction()
.add(R.id.id_fragment_container, fragment).commit();
}
在activity中切换两个fragment
fragment.setArguments(bundle);添加bundle数据
在fragment初始化onCreateView 方法中通过getArguments 获取bundle
切换到FragmentOne 通过fragment容器文件 添加fragment
方法是调用 transaction.replace方法
public void addFragmentOne(){
if(container != null){
OneFragment fragment = new OneFragment();
Bundle bundle = new Bundle();
bundle.putString("text","this is bundle for one fragment");
fragment.setArguments(bundle);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.id_fragment_container, fragment);
transaction.addToBackStack(null);
transaction.commit();
}
}
切换到FragmentTwo 通过fragment容器文件 添加fragment
方法是调用 transaction.replace方法
private void addFragmentTwo(){
if(container != null){
TwoFragment fragment = new TwoFragment();
Bundle bundle = new Bundle();
bundle.putString("text", "this is bundle for two fragment");
fragment.setArguments(bundle);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.id_fragment_container, fragment);
transaction.addToBackStack(null);
// getSupportFragmentManager().beginTransaction()
// .add(R.id.id_fragment_container, fragment).commit();
transaction.commit();
}
只要不停的调用 addFragmentOne 和addFragmentTwo 两个方法就可以实现Fragment在一个容器FrameLayout布局文件中的切换。
在两个fragment通信,传递数据,一般Fragment直接传递数据不可以直接传递,都是通过他们两相关联的Activity作为中间者传递数据。
Android官方介绍了一种传递数据的方法:
http://developer.android.com/training/basics/fragments/communicating.html
在需要传递数据的Fragment中写一个回调接口,
private OnTextClickListener listener;
public interface OnTextClickListener{
public void textClick(String str);
}
在需要传递数据的Fragment onAttach方法中,初始化这个接口 前提就是Activity 实现这个接口
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
try {
listener = (OnTextClickListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnTextClickListener");
}
}
在Activity中实现这个接口,和方法textClick
public class MainActivity extends AppCompatActivity implements TextFragment.OnTextClickListener
在textClick方法中 activity得到了 fragment需要传递的数据
剩下的事情就是将数据传递给需要数据的Fragment
这里有两种不同的情况:
第一种就是 Activity 同时有两个Fragment
此时只需要得到fragment的示例 并非调用接收数据的方法就可以了
OneFragment fragment = (OneFragment)
getSupportFragmentManager().findFragmentById(R.id.id_one);
fragment.print(str);
第二种就是,Activity 里是一个容器 来回切换fragment情况
此时需要new一个新的接收数据的Fragment,把传递的数据作为参数传递给这个Fragment
在调用切换Fragment方法 就可以
transaction.replace(R.id.id_fragment_container, newFragment);
TwoFragment newFragment = new TwoFragment();
Bundle args = new Bundle();
args.putString("data", str);
newFragment.setArguments(args);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.id_fragment_container, newFragment);
transaction.addToBackStack(null);
// Commit the transaction
transaction.commit();
@Override
public void textClick(String str) {
OneFragment fragment = (OneFragment)
getSupportFragmentManager().findFragmentById(R.id.id_one);
fragment.print(str);
/*
*
* //对于一个container 两个fragment切换的情况 传递数据的方法
//就是切换fragment new出需要数据的fragment 将传递的数据作为参数 加入new出的fragment 调用切换frament 方法代码如下
TwoFragment newFragment = new TwoFragment();
Bundle args = new Bundle();
args.putString("data", str);
newFragment.setArguments(args);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.id_fragment_container, newFragment);
transaction.addToBackStack(null);
// Commit the transaction
transaction.commit();
*
*
*
*
* */
}
demo下载地址:https://github.com/gacmy/adnroidFragmentDemo/