碎片的简单用法及碎片与Activity之间的通信
我们都知道手机界面的展示都是由Activity来完成,Acitivity特别常用。但Activity也有局限性在手机界面上显示正常,到了平板上就比较难看了。所以碎片(Fragment)就诞生了。我们也可以把碎片叫做小Activity。在Activity中嵌入两个Fragment。如下:
1、布局
MainActivity
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<fragment
android:id="@+id/frLeft"
android:name="com.valiantman.fragmentfenlan.LeftFragment"
android:layout_width="223dp"
android:layout_height="match_parent"/>
<FrameLayout
android:id="@+id/flContainer"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2">
</FrameLayout>
</LinearLayout>
LeftFragment
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:entries="@array/titles"
android:scrollbars="none" />
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
<TextView
android:id="@+id/tvDetail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30sp"/>
</LinearLayout>
2、LeftFragment
通过接口回调得到数据,定义一个内部接口。在需要回调的类实现该接口,实现接口回调
public class LeftFragment extends BaseFragment {
@Override
public int getLayoutId() {
return R.layout.fragment_left;
}
@Override
public void operation() {
final String[] titles = getResources().getStringArray(R.array.titles);
ListView listView = (ListView) view.findViewById(R.id.list_view);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (resolver != null) {
resolver.showTitleDetail(titles[position]);
}
}
});
}
//用于与Activity之前通信,通过回调把被点击的item的数据传递给Activity
TitleResolver resolver;
public void setResolver(TitleResolver resolver) {
this.resolver = resolver;
}
interface TitleResolver {
void showTitleDetail(String title);
}
}
3、RightFragment
public class RightFragment extends BaseFragment {
@Override
public int getLayoutId() {
return R.layout.fragment_right;
}
@Override
public void operation() {
TextView detail = (TextView) view.findViewById(R.id.tvDetail);
Bundle bundle = getArguments();
String title = bundle.getSerializable(str).toString();
detail.setText(title);
}
}
public class MainActivity extends AppCompatActivity implements LeftFragment.TitleResolver {
private FragmentManager fragmentManager;
private FragmentTransaction fragmentTransaction;
private LeftFragment leftFragment;
private RightFragment fragment;
private Bundle bundle;
public static final String str = "title";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initFragment();
}
private void initFragment() {
fragmentManager = getSupportFragmentManager(); //获取FragmentManager
leftFragment = ((LeftFragment) fragmentManager.findFragmentById(R.id.frLeft));
leftFragment.setResolver(this);
String[] array = leftFragment.getResources().getStringArray(R.array.titles);
replaceFragment();
bundle = new Bundle();
bundle.putString(MainActivity.str,array[0]);
fragment.setArguments(bundle);
}
private void replaceFragment() {
fragment = new RightFragment();
fragmentTransaction = fragmentManager.beginTransaction(); //开启事务
fragmentTransaction.replace(R.id.flContainer, fragment); //替换Fragment
fragmentTransaction.commit(); //提交事务
}
@Override
public void showTitleDetail(String title) {
replaceFragment();
bundle.putString(MainActivity.str,title);
fragment.setArguments(bundle);
}
}
看完代码我们都知道Fragment之间没有直接通信,而是通过与Activity关联来通信。效果图如下