一、fragment的静态加载和动态加载的理解:
我觉得可以把fragment当做为一个自定义的布局,然后去使用这个定义好的布局,对于静态和动态的理解是,静态是讲在主布局文件中放入fragment布局,然后使用,而动态是不需要在主布局文件中去声明fragment的,而是直接在java代码中去添加。
二、通过一个例子来理解:
说明下下面的图:第一个为主界面,通过两个按钮来分别实现静态和动态效果
静态实现:
定义一个fragment_layout布局文件作为静态添加的对象:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:background="#aabbcc"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:textSize="30sp"
android:text="这是静态加载的fragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
定义一个MyFragment类,继承Fragment:
public class MyFragment extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
//定义一个view对象,并返回
//第一个参数为上面定义的布局文件,第二参数为传入的参数,第三个参数一般设为false
View view=inflater.inflate(R.layout.fragment_layout,container,false);
return view;
}
}
创建一个主布局文件activity_main2中放入fragment:(注意这里添加的Fragment要加入name属性)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/myfragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="base.learnfragment.MyFragment"/>
</LinearLayout>
然后再创建一个ActivityMain2加载第二个活动的主布局:
public class ActivityMain2 extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
}
}
至此,一个静态的fragment就实现 了。
下面我们来补充第一个活动的主布局activity_main:(注意这里要加入一个id:container(可以自己定义))
<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"
android:id="@+id/container"
tools:context="base.learnfragment.MainActivity">
<Button
android:text="静态加载fragment"
android:id="@+id/btn_static"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:text="动态加载fragment"
android:id="@+id/btn_dongtai"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
定义第二个类MyFragment2,以及布局文件fragment_layout2:
public class MyFragment2 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.fragment_layout2,container,false);
return view;
}
}
<LinearLayout
android:background="#ff0000"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:textSize="30sp"
android:text="这是动态加载的fragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
补充MainActivity:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn_static).setOnClickListener(this);
findViewById(R.id.btn_dongtai).setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_static:
//跳转到第二个活动,使第二活动完成静态加载fragment
startActivity(new Intent(MainActivity.this,ActivityMain2.class));
break;
case R.id.btn_dongtai:
//声明我们自定义的fragment
MyFragment2 fragment2=new MyFragment2();
//动态添加到布局中,注意replace中的第一个参数为activity_main中的id
getSupportFragmentManager().beginTransaction().replace(R.id.container,fragment2).commit();
break;
}
}
}
这样动态添加也完成了。
总结一下:
1.注意每一个fragment的布局都要有一个与之对应的继承于Fragment的类。
2.关于继承.app.Fragment和.support.v4.app.Fragment的问题:
如果要使用前者,那么MainActivity继承Activity即可,然后动态添加时,是getFragmetManager();
如果使用后者,那么MainActivity要继承FragActivty,然后动态添加时,是getSupportFragmentManager();