Java 带有活动的Android选项卡

Java 带有活动的Android选项卡,java,android,Java,Android,我正在尝试构建一个底部有选项卡的应用程序,当按下该应用程序时,用户可以导航到不同的视图,当按下这些视图上的按钮时,会触发一个新的活动,但底部的选项卡菜单仍保留在那里(如果用户愿意,可以继续导航到其他视图)。我怎样才能以一种不推荐的方式做到这一点 您只能使用片段和一个活动 该活动将在底部有固定的选项卡,并有一个可替换片段的容器 每当您想导航到不同的视图时,只需替换活动容器中的片段,底部选项卡将保持原样。您可以使用片段,并且只能使用一个活动 该活动将在底部有固定的选项卡,并有一个可替换片段的容器 每

我正在尝试构建一个底部有选项卡的应用程序,当按下该应用程序时,用户可以导航到不同的视图,当按下这些视图上的按钮时,会触发一个新的活动,但底部的选项卡菜单仍保留在那里(如果用户愿意,可以继续导航到其他视图)。我怎样才能以一种不推荐的方式做到这一点

您只能使用片段和一个活动

该活动将在底部有固定的选项卡,并有一个可替换片段的容器


每当您想导航到不同的视图时,只需替换活动容器中的片段,底部选项卡将保持原样。

您可以使用片段,并且只能使用一个活动

该活动将在底部有固定的选项卡,并有一个可替换片段的容器


每当您想导航到不同的视图时,只需替换活动容器中的片段,底部的选项卡将保持原样。

下面是一个简单的演示,展示了选项卡的使用:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
        ViewPager viewPager = (ViewPager) findViewById(R.id.content_pager);
        Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);

        FragmentPager fragmentPager = new FragmentPager(getSupportFragmentManager());

        for(int i = 0; i < 3; i++){

            Bundle args = new Bundle();
            args.putString(SimpleFragment.FRAG_KEY, "Fragment "+ i);
            fragmentPager.addFragment(SimpleFragment.newInstance(args));
        }

        viewPager.setAdapter(fragmentPager);
        tabLayout.setupWithViewPager(viewPager);
        tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
    }


    public class FragmentPager extends FragmentPagerAdapter{

        List<Fragment> mFragments;

        public FragmentPager(FragmentManager fm) {
            super(fm);
            mFragments = new ArrayList<>();
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return "Fragment "+ position;
        }

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

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

        public void addFragment(Fragment fragment){
            mFragments.add(fragment);
        }
    }
}
布局:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools">

    <android.support.v7.widget.AppCompatTextView
        android:id="@+id/tv_simple"
        tools:text="@string/app_name"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</FrameLayout>

下面是一个简单的演示,展示了选项卡的使用:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
        ViewPager viewPager = (ViewPager) findViewById(R.id.content_pager);
        Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);

        FragmentPager fragmentPager = new FragmentPager(getSupportFragmentManager());

        for(int i = 0; i < 3; i++){

            Bundle args = new Bundle();
            args.putString(SimpleFragment.FRAG_KEY, "Fragment "+ i);
            fragmentPager.addFragment(SimpleFragment.newInstance(args));
        }

        viewPager.setAdapter(fragmentPager);
        tabLayout.setupWithViewPager(viewPager);
        tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
    }


    public class FragmentPager extends FragmentPagerAdapter{

        List<Fragment> mFragments;

        public FragmentPager(FragmentManager fm) {
            super(fm);
            mFragments = new ArrayList<>();
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return "Fragment "+ position;
        }

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

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

        public void addFragment(Fragment fragment){
            mFragments.add(fragment);
        }
    }
}
布局:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools">

    <android.support.v7.widget.AppCompatTextView
        android:id="@+id/tv_simple"
        tools:text="@string/app_name"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</FrameLayout>

您要做的是使用1个活动并加载多个片段。对于底部的工具栏,我建议您使用工具栏,并在其内部包装标签,这不是不推荐的方式吗?有什么不推荐的方法可以做到这一点?我不明白这个问题。为什么不在每个布局中包含选项卡?无论如何,您应该使用
Fragment
s。这正是他们的目的。是的,我可以使用片段来呈现不同的视图。但当我按下一个按钮时,我想调用一个新的活动并替换那个片段,然后如果我按下后退,我想再次回到那个片段。这是我真正的问题。还有,如何使用工具栏并将其附着在底部?我不能让它在大屏幕上工作…你要做的是使用1个活动并加载多个片段。对于底部的工具栏,我建议您使用工具栏,并在其内部包装标签,这不是不推荐的方式吗?有什么不推荐的方法可以做到这一点?我不明白这个问题。为什么不在每个布局中包含选项卡?无论如何,您应该使用
Fragment
s。这正是他们的目的。是的,我可以使用片段来呈现不同的视图。但当我按下一个按钮时,我想调用一个新的活动并替换那个片段,然后如果我按下后退,我想再次回到那个片段。这是我真正的问题。还有,如何使用工具栏并将其附着在底部?我不能让它在大屏幕上工作……但当我按下片段中的一个按钮时,我想在它的位置触发一个活动。我应该发射一个新的碎片吗?@CapBaracudas:“我应该发射一个新的碎片吗?”——是的。如果你想要一个持久的UI(例如,你的标签栏),切换到新的活动不是正确的解决方案。但是当我按下一个片段中的按钮时,我想在它的位置触发一个活动。我应该发射一个新的碎片吗?@CapBaracudas:“我应该发射一个新的碎片吗?”——是的。如果您想要一个持久的UI(例如,您的选项卡栏),切换到新活动不是正确的解决方案。如果我使用ViewPager,我以后如何跟踪我的片段并更新它?我在这里找到了一个解决方案(1),但它似乎应该是一种更简单或更正式的方式?1.@CapBaracudas您可以使用适配器获取对视图中当前项的引用:
SimpleFragment fragment=(SimpleFragment)fragmentPager.getItem(viewPager.getCurrentItem())如果我使用ViewPager,我以后如何跟踪片段并更新它?我在这里找到了一个解决方案(1),但它似乎应该是一种更简单或更正式的方式?1.@CapBaracudas您可以使用适配器获取对视图中当前项的引用:
SimpleFragment fragment=(SimpleFragment)fragmentPager.getItem(viewPager.getCurrentItem())
<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>


    <style name="MyCustomTabLayout" parent="Widget.Design.TabLayout">
        <item name="tabIndicatorColor">?attr/colorAccent</item>
        <item name="tabIndicatorHeight">2dp</item>
        <item name="tabPaddingStart">12dp</item>
        <item name="tabPaddingEnd">12dp</item>
        <item name="tabBackground">?attr/selectableItemBackground</item>
        <item name="tabTextAppearance">@style/MyCustomTabTextAppearance</item>
        <item name="tabSelectedTextColor">?android:textColorPrimary</item>
    </style>
    <style name="MyCustomTabTextAppearance" parent="TextAppearance.Design.Tab">
        <item name="android:textSize">14sp</item>
        <item name="android:textColor">?android:textColorSecondary</item>
        <item name="textAllCaps">true</item>
    </style>

</resources>
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.2.0'
    compile 'com.android.support:design:23.2.0'
}