碎片的簡單用法及碎片與Activity之間的通信

碎片的簡單用法及碎片與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>

RightFragment
<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);
    }
}

4、MainActivity
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關聯來通信。效果圖如下








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章