【问题标题】:Fragments with TabLayout and ViewPager带有 TabLayout 和 ViewPager 的片段
【发布时间】:2016-10-16 18:36:21
【问题描述】:

目前我有带有 2 个选项卡(带有两个片段)的 MainActivity 和带有 3 个菜单项的导航视图。 我现在只有一项带有标签的活动。在 MainActivity 中,我初始化了 Toolbar、NavigationView、ViewPager、TabLayout。我这里还有一个适配器实例,它为标签创建片段。

当我选择一个菜单项时,我希望它打开一个带有其他两个选项卡(带有其他两个片段)的新片段。

如何用片段实现呢? 还是更好地使用额外的 Activity?

NavigationView

MainActivity with two tabs

activity_main_xml:

<android.support.design.widget.CoordinatorLayout
    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"
            android:theme="@style/ThemeOverlay.AppCompat.Dark"

            />

        <android.support.design.widget.TabLayout
            android:id="@+id/tabLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"

            app:tabIndicatorColor="@android:color/white"
            app:tabIndicatorHeight = "6dp"

            app:tabSelectedTextColor="@android:color/white"
            app:tabTextColor="@android:color/white"
            />

    </android.support.design.widget.AppBarLayout>


    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"

        />

</android.support.design.widget.CoordinatorLayout>






<android.support.design.widget.NavigationView
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:id="@+id/navigationView"
    android:layout_gravity="start"
    app:headerLayout="@layout/navigation_header"
    app:menu="@menu/menu_navigation"

/>

MainActivity:

package ru.alexbykov.sailesstat;

import android.os.Bundle;
import android.support.design.widget.NavigationView;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;

import ru.alexbykov.sailesstat.statistic.adapter.TheSalesTabsFragmentAdapter;

public class MainActivity extends AppCompatActivity {


    private static final int LAYOUT = R.layout.activity_main;

    DrawerLayout drawerLayout;
    Toolbar toolbar;
    ViewPager viewPager;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        setTheme(R.style.AppDefault);
        super.onCreate(savedInstanceState);
        setContentView(LAYOUT);


        setupToolBar();
        setupNavigationView();
        setupTabs();


    }

    private void setupToolBar() {


        toolbar = (Toolbar) findViewById(R.id.toolbar);
        toolbar.setTitle(R.string.app_name);

    }

    private void setupNavigationView() {

        drawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);

        ActionBarDrawerToggle togle =
                new ActionBarDrawerToggle(
                        this,
                        drawerLayout,
                        toolbar,
                        R.string.view_navigation_open,
                        R.string.view_navigation_close);

//     drawerLayout.setDrawerListener(togle);

        togle.syncState();


        NavigationView navigationView = (NavigationView) findViewById(R.id.navigationView);

        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(MenuItem item) {


                drawerLayout.closeDrawers();

                switch (item.getItemId())
                {


                }




                return true;
            }
        });


    }

/*    private void startTendersFragment() {


        fTrans = getSupportFragmentManager().beginTransaction();;
        TendersFragment tendersFragment = new TendersFragment();

        fTrans
                .add(R.id.frameLayout, tendersFragment)
                .addToBackStack(null)
                .commit();


    }*/




    private void setupTabs() {


        viewPager = (ViewPager) findViewById(R.id.viewPager);
        TheSalesTabsFragmentAdapter adapter = new TheSalesTabsFragmentAdapter(this, getSupportFragmentManager());
        viewPager.setAdapter(adapter);

        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabLayout);
        tabLayout.setupWithViewPager(viewPager);

    }




}

TheSalesTabsFragmentAdapter

   package ru.alexbykov.sailesstat.statistic.adapter;

import android.content.Context;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

import java.util.HashMap;
import java.util.Map;

import ru.alexbykov.sailesstat.statistic.fragments.AbstractTabFragment;
import ru.alexbykov.sailesstat.statistic.fragments.fragmentsTheSale.ManagersFragment;
import ru.alexbykov.sailesstat.statistic.fragments.fragmentsTheSale.PlanFragment;

/**
 * Created by Alexey on 09.06.2016.
 */
public class TheSalesTabsFragmentAdapter extends FragmentPagerAdapter {




    //for use strings
    private Context context;
    private Map<Integer, AbstractTabFragment> tabs;



    public TheSalesTabsFragmentAdapter(Context context, FragmentManager fm) {
        super(fm);

        this.context = context;
        initTabs();
    }

    @Override
    public Fragment getItem(int position) {
        return tabs.get(position);
    }

    @Override
    public int getCount() {
        return tabs.size();
    }

    @Override
    public CharSequence getPageTitle(int position) {

        return tabs.get(position).getTitle();
    }

    private void initTabs() {

        tabs = new HashMap<>();

            tabs.put(0, PlanFragment.getInstance(context));
            tabs.put(1, ManagersFragment.getInstance(context));

    }
}

ManagersFragment

package ru.alexbykov.sailesstat.statistic.fragments;


import android.content.Context;
import android.support.v4.app.Fragment;
import android.view.View;

public class AbstractTabFragment extends Fragment {


    private String title;
    protected Context context;
    protected View view;


    public void setTitle(String title) {
        this.title = title;
    }

    public void setContext(Context context) {

        this.context=context;

    }

    public String getTitle() {
        return title;
    }
}

计划片段

package ru.alexbykov.sailesstat.statistic.fragments.fragmentsTheSale;


import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import ru.alexbykov.sailesstat.R;
import ru.alexbykov.sailesstat.statistic.fragments.AbstractTabFragment;

/**
 * A simple {@link Fragment} subclass.
 */
public class PlanFragment extends AbstractTabFragment {

    private static final int LAYOUT = R.layout.fragment_plan;





    public static PlanFragment getInstance(Context context) {


/*        Bundle bundle = new Bundle();
        fragment.setArguments(bundle);*/


        PlanFragment fragment = new PlanFragment();
        fragment.setContext(context);
        fragment.setTitle(context.getString(R.string.tab_plan_stat_fragment));

        return fragment;


    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        view = inflater.inflate(LAYOUT, container, false);
        return view;
    }








}

AbstractTabFragment

package ru.alexbykov.sailesstat.statistic.fragments;


import android.content.Context;
import android.support.v4.app.Fragment;
import android.view.View;

public class AbstractTabFragment extends Fragment {


    private String title;
    protected Context context;
    protected View view;


    public void setTitle(String title) {
        this.title = title;
    }

    public void setContext(Context context) {

        this.context=context;

    }

    public String getTitle() {
        return title;
    }
}

【问题讨论】:

    标签: java android android-fragments


    【解决方案1】:

    与 NavigationViews 一样,最初的 Fragment 并不是最佳实践。我会推荐按钮来切换活动而不使用片段。如果我理解正确,您的主页会包含内容,我将在其中添加三个按钮,每个按钮都旨在在 NavigationView 的 leiu 中启动另一个活动。这些活动中的每一个都有自己的按钮,这些按钮将引导您从那里进入您想要进行的任何活动。

    【讨论】:

    • 我有包含内容的主页(图 2)。此页面在应用程序启动时创建。为什么使用 Fragments 和 NavigationView 不是好的做法?
    • 是的,那很好,您将从那里启动其他活动。片段通常仅在您为手机和平板电脑定制应用程序时使用。在手机中它们是全屏的,在平板电脑上它们显示为屏幕空间的分割(想想 Apple 上的设置页面)。一般来说,他们更难合作,所以普遍的看法是他们毫无意义。 NavigationViews 只是被视为一种懒惰的编程实践,因为它很容易在其中粘贴一堆选项并混淆用户(旧的 Spotify 就是这样,他们最终切换了)
    • 感谢您的回答。但无论如何,我这样做是为了学习。我想了解如何通过在一个片段中使用选项卡和片段来实现这一点。(由用户在导航菜单中选择)
    • 这点值得称赞。如果您使用意图来更改活动,它本质上是一个类似的操作,但您将使用一种称为替换的方法。这是 FragmentTransaction 类的文档,其中包括:developer.android.com/reference/android/support/v4/app/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    相关资源
    最近更新 更多