具有Viewpager,tabs和drawerlayout的片段容器不起作用

时间:2015-08-30 17:04:34

标签: android android-fragments

我的activity_main.xml中有一个drawerlayout,viewpager和tablayout我有两个片段HomeFragmentBookingFragment,我正试图从另一个活动中启动BookingFragment在itemclick上。我尝试了多种解决方案,比如创建一个id container的framelayout,然后将寻呼机放入其中,然后在片段事务中使用它,我也尝试使用相同的id创建一个空的framelayout并将其放在寻呼机上方,但它不起作用。

这是我尝试从

启动片段的方法代码
public void startTransaction(){
        Fragment newFragment = new BookingFragment();
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.add(R.id.pager, newFragment);
        transaction.addToBackStack(null);
        transaction.commit();
    }

这是我的activity_main.xml

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="net.app.cairobus.cairobus.MainActivity">


    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">

        <android.support.v7.widget.Toolbar
            android:id="@+id/app_bar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:background="?attr/colorPrimary"
            android:elevation="6dp"
            android:minHeight="?attr/actionBarSize"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

        <android.support.design.widget.TabLayout
            android:id="@+id/tab_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/app_bar"
            android:background="?attr/colorPrimary"
            android:elevation="6dp"
            android:minHeight="?attr/actionBarSize"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />


        <android.support.v4.view.ViewPager
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:layout_height="fill_parent"
            android:layout_below="@id/tab_layout"
            android:background="#fff" />


    </LinearLayout>

    <android.support.design.widget.NavigationView
        android:id="@+id/main_drawer"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="#f2f2f2"
        app:headerLayout="@layout/drawer_header"
        app:itemIconTint="@color/accent"
        app:itemTextColor="@color/secondary_text"
        app:menu="@menu/menu_drawer" />


</android.support.v4.widget.DrawerLayout>

这是我正在尝试开始的片段

public class BookingFragment extends Fragment {

    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";
    private String mParam1;
    private String mParam2;
    private OnFragmentInteractionListener mListener;

    public static BookingFragment newInstance(String param1, String param2) {
        BookingFragment fragment = new BookingFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    public BookingFragment() {}

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }


    }

    @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_booking, container, false);
    }

    public void onButtonPressed(Uri uri) {
        if (mListener != null) {
            mListener.onFragmentInteraction(uri);
        }
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

    public interface OnFragmentInteractionListener {
        // TODO: Update argument type and name
        public void onFragmentInteraction(Uri uri);
    }

}

1 个答案:

答案 0 :(得分:0)

您无法以编程方式将Fragment添加到ViewPager。这是FragmentPagerAdapter

的工作

因此,您的主要活动有一个HomeFragment标签和一个BookingFragment标签。您想要从HomeFragment导航到TripActivity,然后从TripActivity导航到BookingFragment。

要从HomeFragment导航到TripActivity,请使用Activity.startActivityForResult()

要从TripActivity导航回BookingFragment,请致电Activity.setResult(),然后致电Activity.finish()。在setResult()中,您可以设置结果代码,这意味着&#34;打开BookingFragment&#34;并在数据意图中设置您需要的任何其他参数。

在您的MainActivity中,覆盖onActivityResult()。收到BookingFragment的结果代码后,请致电setCurrentItem(page)上的ViewPager以显示BookingFragment。

如果您需要在BookingFragment中设置字段,则需要保留对adapter.getItem()返回的BookingFragment的引用,以便您可以调用setter等。