碎片(Fragment)是一种可以嵌入到活动中的UI片段,它能让程序更加合理和充分地利用屏幕的空间,因而在平板上的应用的非常广泛。和活动有许多地方相像,同样可以包含布局,同样有自己的生命周期。(个人学习尚浅,未发现碎片优势,碎片嵌套的效果活动嵌套都可实现,活动嵌套请参考”活动嵌套“)。下面用一个项目描述碎片的动态及静态添加。
1.创建左侧碎片布局left_fragment.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">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Button"/>
</LinearLayout>
2.创建another_right_fragment.xml,该布局用于动态添加,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:background="#ffff00"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:textSize="20sp"
android:text="This is another right fragment"
/>
</LinearLayout>
3.新建一个继承Fragment的LeftFragment类,在其中重写Fragment的onCreateView()方法,然后在这个方法中通过LayoutInflater的inflate()方法将刚才定义的left_fragment布局加载进来,代码如下:
LeftFragment.java
public class LeftFragment extends Fragment {
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.left_fragment, container, false);
return view;
}
}
4.新建一个继承Fragment的AnotherRightFragment类,重复上述步骤,代码如下:
AnotherRightFragment.java
public class AnotherRightFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.another_right_fragment, container, false);
return view;
}
}
5.在activity_main.xml中使用<fragment>标签在布局中静态添加碎片,通过android:name属性指明要添加的碎片名,注意要将类的包名带上。同时定义一个布局,用于存放碎片,以达到动态使用碎片的目的,这里使用FrameLayout布局,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<fragment
android:id="@+id/left_fragment"
android:name="com.example.fragmenttest.LeftFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
<FrameLayout
android:id="@+id/right_layout"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
</LinearLayout>
6.至此静态添加已经完成,下面去完成动态添加操作。我们在MainActivity.java中实现动态添加操作,代码如下:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
//1.创建待添加的碎片实例
replaceFragment(new AnotherRightFragment());
break;
default:
break;
}
}
private void replaceFragment(Fragment fragment) {
//2.获取FragmentManager,在活动中直接调用getSupportFragmentManager()方法获得
FragmentManager fragmentManager = getSupportFragmentManager();
//3.开启一个事务,通过调用beginTransaction()方法开启
FragmentTransaction transaction = fragmentManager.beginTransaction();
//4.像容器添加或替换碎片,一般用replace()方法实现,参数为容器id和待添加的碎片实例
transaction.replace(R.id.right_layout, fragment);
//5.提交事务,调用commit()方法即可
transaction.commit();
}
}
至此完成,运行结果如下图:
点击button前,只显示左侧静态添加:
点击button后,显示右侧动态添加: