碎片的簡單用法及碎片與Activity之間的通信
<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>
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);
}
}
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關聯來通信。效果圖如下