使用Fragment 实现动态UI 和 动态添加Fragment
首先写好每个Fragment:
1.在第一个Fragment写一个按钮,使其加载下一个Fragment
布局:
<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" tools:context=".MainActivity" android:orientation="horizontal" > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="加载"/> </LinearLayout>
java代码:
public class LeftFragment extends Fragment{ OnClickButton mCallback; //定义一个接口 public interface OnClickButton{ //并实现一个方法,用来传值并在(onAttach()中绑定activity) public void onClickB(); } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //绑定布局文件并获取到里面的控件,特别 注意里面的 view View view = inflater.inflate(R.layout.fragment_left,null); Button button = (Button) view.findViewById(R.id.button1); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mCallback.onClickB(); } }); return view; } /** * 绑定到activity * @param activity */ public void onAttach(Activity activity) { super.onAttach(activity); try { mCallback = (OnClickButton) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnHeadlineSelectedListener"); } } }
加载显示出来的布局文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="新闻内容" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> </LinearLayout>
java文件:
public class RightFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_right, null); Button button = (Button) view.findViewById(R.id.button2); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //getActivity() 获取父类的activity Toast.makeText(getActivity(), "我是fragment", Toast.LENGTH_SHORT).show(); } }); return view; } }
主类:
布局
给Fragment创建一个容器activity_main.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent"/>
注意:一定要写明id。
然后就在activity中实现Fragment add进去就行了!
//实现LeftFragment中定义的接口,主要用来传值或者按钮点击事件 public class MainActivity extends Activity implements LeftFragment.OnClickButton { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化第一个Fragment if (findViewById(R.id.fragment_container) != null){ if (savedInstanceState != null) { return; } LeftFragment leftFragment = new LeftFragment(); leftFragment.setArguments(getIntent().getExtras()); getFragmentManager().beginTransaction().add(R.id.fragment_container,leftFragment).commit(); } } /** * 实现接口中的方法和点击按钮后加载的fragment */ @Override public void onClickB() { FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); RightFragment rightFragment = new RightFragment(); transaction.replace(R.id.fragment_container, rightFragment); transaction.addToBackStack(null); transaction.commit(); } }
这样就实现了一个很小的demo!
动态添加Fragment
首先新建两个fragment的布局文件
fragment1
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#00ff00" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="This is fragment 1" android:textColor="#000000" android:textSize="25sp" /> </LinearLayout>
fragment2
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#0000ff" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="This is fragment 2" android:textColor="#000000" android:textSize="25sp" /> </LinearLayout>
新建两个Fragment类继承Fragment
Fragment1
public class Fragmet1 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment1,container,false); } }
Fragment2
public class Fragmet2 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment2,container,false); } }
然后定义一个显示fragment的mainactivity.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:baselineAligned="false" > <Button android:id="@+id/btn_show_fragment1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="显示Fragment1"/> <Button android:id="@+id/btn_show_fragment2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="显示Fragment2"/> <FrameLayout android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout>
其中FrameLayout是用来显示Fragment的,在MainActivity中实现
public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity); Button button1 = (Button) findViewById(R.id.btn_show_fragment1); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //动态添加Fragment FragmentManager manager = getSupportFragmentManager(); FragmentTransaction ft = manager.beginTransaction(); Fragmet1 fragmet1 = new Fragmet1(); ft.add(R.id.fragment_container,fragmet1); ft.commit(); } }); Button button2 = (Button) findViewById(R.id.btn_show_fragment2); button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { FragmentManager manager = getSupportFragmentManager(); FragmentTransaction ft = manager.beginTransaction(); Fragmet2 fragmet2 = new Fragmet2(); ft.add(R.id.fragment_container,fragmet2); ft.commit(); } }); } }
ok 基本就完成了。
注意:
动态添加Fragment主要分为4步:
- 1.获取到FragmentManager,在V4包中通过getSupportFragmentManager,在系统中原生的Fragment是通过getFragmentManager获得的。
- 2.开启一个事务,通过调用beginTransaction方法开启。
- 3.向容器内加入Fragment,一般使用add或者replace方法实现,需要传入容器的id和Fragment的实例。
- 4.提交事务,调用commit方法提交。
posted on 2016-03-16 17:47 傻啦吧唧的程序员丶 阅读(8974) 评论(0) 编辑 收藏 举报