在开发中,我们经常要用到碎片,碎片与活动特别像,但却不是。在我们平常看到的平板与手机之间的app会清晰地发现两者的不同点,在于手机只有一个活动窗口,而平板除了一个活动窗口外它有可能还增加了一个以上的详细信息。
接下来,我们就先学习如何简单地使用Fragment。
一、我们可以创建一个碎片布局。命名为fragment_easy。
<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/left_button"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/left_button"/>
</LinearLayout>
二、我们在创建一个继承support-v4的Fragment的类名为EasyFragment的类,覆盖其oncreateview方法。
public class EasyFragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_easy, container, false);
}
}
三、在activity布局中添加fragment标签,name值为我们要添加的fragment类。
<fragment
android:id="@+id/left_fragment"
android:name="com.zlq.fragmentlibrary.EasyFragment"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"/>
我们现在已经了解了fragment的简单使用,现在我们就可以动态的切换fragment。
一、我们再次向之前一样新建一个fragment。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:background="#9e091eff"
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="@string/this_is_another_right_fragment"/>
</LinearLayout>
public class AnotherEasyRightFragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.another_right_fragment_easy, container, false);
}
}
二、把activity的布局中的fragment换成FrameLayout,然后用控件切换。
public class EasyFragment extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_easy_fragment);
replaceFragment(new RightEasyFragment());
((Button) findViewById(R.id.left_button)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
replaceFragment(new AnotherEasyRightFragment());
}
});
}
private <T extends android.support.v4.app.Fragment> void replaceFragment(T fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.right_layout,fragment);
fragmentTransaction.commit();
}
}
在碎片中,我们注册了一个按钮,通过按钮切换fragment。
主要步骤:
1、创建待添加的碎片实例。
2、获取FragmentManager,活动中可以直接通过调用getSupportFragmentManager()方法得到。
3、开启一个事务,通过调用beginTransaction()方法开启。
4、向窗口内添加或替换碎片,一般使用replace()方法实现,需要传入窗口的id和待添加的碎片实例。
5、提交事务,调用commit()方法完成。
碎片中如何像activity一样返回至上一个fragment。
fragmentTransaction.addToBackStack(null);
碎片与活动间的通信。
获取对应的实例:
RightFragment rightFragment = (RightFragment)getSupportFragmentManager().findFragmentById(R.id.right_fragment);
获取对应的activity实例:MainActivity activity =(MainActivity)getActivity();从中获取context。
碎片间通信。
碎片间的通信,是需要通过中间的活动,所以,一个碎片获取该实例,然后通过这个实例获取另一个碎片。