在开发中,我们经常要用到碎片,碎片与活动特别像,但却不是。在我们平常看到的平板与手机之间的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。
碎片间通信。
碎片间的通信,是需要通过中间的活动,所以,一个碎片获取该实例,然后通过这个实例获取另一个碎片。