1.静态加载Fragment
静态加载的基本思路是:从MainActivity启动SecondActivity,在SecondActivity的布局中有一个<fragment>
标签,此标签依附于我们自己写的一个类MyFragment,MyFragment类继承自Fragment,并重写了它的View onCreateView
方法,此方法返回一个匹配好的view对象,而此方法中的inflater.inflate(R.layout.fragment, container,false);
匹配了我们想要fragment呈现的布局,这里只有一个textView控件。
MainActivity布局:
<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"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:id="@+id/btn1"
android:text="静态加载Fragment"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:id="@+id/btn2"
android:text="动态加载Fragment"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/frame"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
></LinearLayout>
</LinearLayout>
MainActivity.java:
public class MainActivity extends Activity implements OnClickListener{
private Button btn1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1 = (Button)findViewById(R.id.btn1);
btn1.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.btn1:
Intent intent = new Intent(getApplicationContext(),SecondActivity.class);
startActivity(intent);
break;
}
}
}
SecondActivity.java:
public class SecondActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
}
activity_second.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<fragment
android:id="@+id/fragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:name = "jimo.fragment.MyFragment"
></fragment>
</LinearLayout>
MyFragment.java:
public class MyFragment extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
/**
* 参数解释:
* resource:Fragment需要加载的布局文件
* root:加载layout的父ViewGroup
* attactToRoot:false,不返回父ViewGroup
*/
View view = inflater.inflate(R.layout.fragment, container,false);//layout布局文件转换成View对象
TextView txt = (TextView)view.findViewById(R.id.txt);//注意,这里要用view.findViewById
txt.setText("静态加载Fragment");
return view;
}
}
fragment.xml:
<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:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/txt"
/>
</LinearLayout>
运行结果:
点击第一个按钮:
2.动态加载Fragment:
动态加载的基本思路是:直接在MainActivity的布局里(也就是主界面)加载fragment的布局,可以看到在activity_main里后面有一个LinearLayout布局,里面什么也没写,现在我们就要在点击第二个按钮时动态的把fragment.xml里的布局加入其中。
具体实现:
1.再次写一个Fragment的子类DDFragment(Dynamic Load Fragment),内容和静态时一样。
2.修改btn2的点击事件,采用事务的方式加载布局,和数据库的事务差不多。ft.add(R.id.frame, ddf);
这句代码我想是可以理解的,就是把ddf对应的fragment加入到id为frame的LinearLayout布局中。
最后别忘了提交。
DDFragment.java
public class DDFragment extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment, container,false);
TextView txt = (TextView) view.findViewById(R.id.txt);
txt.setText("动态加载Fragment");
return view;
}
}
btn2点击事件:
case R.id.btn2:
DDFragment ddf = new DDFragment();
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.frame, ddf);
ft.commit();
break;
default:break;
运行结果:
开始:
点击第二个按钮:
3.总结:
看起来静态加载和直接跳转没什么区别
动态加载用的是很多的。