Inflating AppBarLayout with Toolbar + TabLayout

前端 未结 7 1041
隐瞒了意图╮
隐瞒了意图╮ 2021-01-30 23:21

I currently have a DrawerLayout in my main.xml. There\'s a Toolbar wrapped in an AppBarLayout, and then a simple LinearLayout to swap out fragments.

One of the fragment

相关标签:
7条回答
  • 2021-01-30 23:28

    You can simply add TabLayout programmatically from Fragment in wich you need TabLayout

    tabLayout = (TabLayout) inflater.inflate(R.layout.tablay, null);
    appBarLayout = (AppBarLayout) getActivity().findViewById(R.id.appbar);
    appBarLayout.addView(tabLayout, new LinearLayoutCompat.LayoutParams(
        ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
    

    and remove TabLayout from AppBar in onDetach()

    @Override
    public void onDetach() {
        appBarLayout.removeView(tabLayout);
        super.onDetach();
    }
    
    0 讨论(0)
  • 2021-01-30 23:32

    To fix my problem I ended up putting the Toolbar, TabLayout, and ViewPager all in my MainActivity.

    main_activity.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/drawerLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <android.support.design.widget.CoordinatorLayout
            android:id="@+id/rootLayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
            <android.support.design.widget.AppBarLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
    
                <android.support.v7.widget.Toolbar
                    android:id="@+id/toolbar"
                    android:layout_width="match_parent"
                    android:layout_height="?attr/actionBarSize"
                    android:background="?attr/colorPrimary"
                    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
                    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
    
                <android.support.design.widget.TabLayout
                    android:id="@+id/tabLayout"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    app:tabMode="fixed"
                    app:tabGravity="fill"
                    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>
    
                <android.support.v4.view.ViewPager
                    android:id="@+id/viewpager"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@android:color/white" />
            </android.support.design.widget.AppBarLayout>
    
            <RelativeLayout
                android:id="@+id/flContent"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical"
                app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
    
        </android.support.design.widget.CoordinatorLayout>
    
        <android.support.design.widget.NavigationView
            android:id="@+id/navigation"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            app:headerLayout="@layout/nav_header"
            app:itemIconTint="#333"
            app:itemTextColor="#333"
            app:menu="@menu/navigation_drawer_items" />
    
    </android.support.v4.widget.DrawerLayout>
    

    Then, in all of my fragments, I set the visibility for the TabLayout and the ViewPager programmatically in onCreateView:

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            TabLayout tabLayout = (TabLayout) getActivity().findViewById(R.id.tabLayout);
            tabLayout.setVisibility(View.GONE);
            ViewPager mViewPager = (ViewPager) getActivity().findViewById(R.id.viewpager);
            mViewPager.setVisibility(View.GONE);
    
            return inflater.inflate(R.layout.fragment_layout, container, false);
    }
    

    Of course, in the fragment with tabs, you would want to set the visibility to View.VISIBLE instead of View.GONE.

    0 讨论(0)
  • 2021-01-30 23:35

    The Artem_lens approach worked for me with some modifications.

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        ...
    
        mTabLayout = (TabLayout) inflater.inflate(
                R.layout.partial_tab_layout,
                container,
                false);
        mAppBarLayout = (AppBarLayout) getActivity().findViewById(R.id.app_bar);
        mAppBarLayout.addView(mTabLayout,
                new LinearLayoutCompat.LayoutParams(
                        ViewGroup.LayoutParams.MATCH_PARENT,
                        ViewGroup.LayoutParams.WRAP_CONTENT));
    
        ...
    }
    

    And removing the view at onDestroyView()

    @Override
    public void onDestroyView() {
        mAppBarLayout.removeView(mTabLayout);
        super.onDestroyView();
    }
    
    0 讨论(0)
  • 2021-01-30 23:40

    I modified the solution given by bleeding182 and got it to work for AppBarLayout as well (to resolve the problem pointed out by bopa).

    @Override
    public void onAttach(Context context) {
    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            getActivity().findViewById(R.id.appbar).setElevation(0);
        }
        super.onAttach(context);
    
    }
    
    @Override
    public void onDetach() {
        super.onDetach();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            getActivity().findViewById(R.id.appbar).setElevation(R.dimen.toolbar_elevation);
        }
    }
    

    What I did was replace the call to getSupportActionBar() by giving an ID to my AppBarLayout and then calling findViewById() on it and then calling setElevation on its result. Tested on API 23.

    0 讨论(0)
  • 2021-01-30 23:41

    The solution is simple in the XML. Just add the following code to your AppBarLayout: app:elevation="0dp". So the AppBarLayout should look like this:

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:elevation="0dp"
        android:theme="@style/AppTheme.AppBarOverlay">
    
    0 讨论(0)
  • 2021-01-30 23:46

    You are able to have separate toolbar for each fragment. Its possible to set fragments toolbar as activity actionbar. Example code:

    Toolbar toolbar = (Toolbar) v.findViewById(R.id.toolbar);
     ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
    

    It should be possible to have titles, icons and other stuff as well. With it you can mimic shadow on pre lollipop devices, no matter what you have on them.

    0 讨论(0)
提交回复
热议问题