【问题标题】:FragmentTabHost from Navigation Drawer导航抽屉中的 FragmentTabHost
【发布时间】:2015-06-14 16:38:14
【问题描述】:

我正在尝试使用 Android Studio 中的示例 Navigation Drawer 应用创建带有 Navigation Drawer 的应用。我试图从导航抽屉创建的第一个片段有 3 个选项卡,我正在尝试使用 FragmentTabHost 在选项卡之间切换并在每个选项卡下方加载一个略有不同的片段。我希望用户导航的主要部分导航抽屉中的应用程序以及在某些屏幕上我想使用 TabHost 进行子级导航。我基本上想使用这里的 Android 开发者网站上推荐的两级导航之类的东西: https://www.google.com/design/spec/patterns/navigation.html#navigation-two-levels

我在这里找到了一些如何使用 FragmentTabHost 的示例:http://developer.android.com/reference/android/support/v4/app/FragmentTabHost.html

第一个示例不起作用,因为 FragmentTabHost 正在扩展 FragmentActivity,但 Navigation Drawer 代码似乎只调用 Fragments

尝试使用嵌套片段实现第二个示例给我一个错误,如下错误:

错误:(106, 17) 错误: 没有找到合适的安装方法(FragmentActivity,FragmentManager,int) 方法 TabHost.setup(LocalActivityManager) 不适用 (实际参数列表和形式参数列表的长度不同) 方法 TabHost.setup() 不适用 (实际参数列表和形式参数列表的长度不同)

在:

mTabHost.setup(getActivity(), getChildFragmentManager(), 
            R.layout.fragment_tab_host);

这是我的 MainActivity.java 中的一个 sn-p:

public class MainActivity extends ActionBarActivity
    implements NavigationDrawerFragment.NavigationDrawerCallbacks{

    private NavigationDrawerFragment mNavigationDrawerFragment;

    @Override
    public void onNavigationDrawerItemSelected(int position) {
        // update the main content by replacing fragments
        Fragment fragment = null;
        switch (position) {
            case 0:
                fragment = new fragment_tabHost();
                break;
            default:
                break;
        }

        if (fragment != null) {
            FragmentManager fragmentManager = getSupportFragmentManager();
            fragmentManager.beginTransaction()
                .replace(R.id.container, fragment).commit();
            // update selected item and title, then close the drawer

        } else {
            Log.e("MainActivity", "Error in creating fragment");
        }
    }
}

这里是 fragment_tabhost.java 的代码的 sn-p,当您单击导航抽屉中的第一项时会调用该代码:

import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTabHost;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TabHost;

public class fragment_tabHost extends Fragment {

    private TabHost mTabHost;    
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        mTabHost = new FragmentTabHost(getActivity());
        mTabHost.setup(getActivity(), getChildFragmentManager(),  
            R.layout.fragment_tab_host);

        mTabHost.addTab(mTabHost.newTabSpec("tab1").setIndicator("Tab1"),
            tab1.class, null);
        mTabHost.addTab(mTabHost.newTabSpec("tab2").setIndicator("Tab2"),
            tab2.class, null);
        mTabHost.addTab(mTabHost.newTabSpec("tab3").setIndicator("Tab3"),
            tab3.class, null);

        return mTabHost;

    }
}

我只针对 API 级别 15 的最低 SDK,因此如果存在更好的方法,我愿意接受。

【问题讨论】:

  • 我一直在考虑使用操作栏选项卡,但我在某处看到它们已被弃用。

标签: android android-fragments android-tabhost fragment-tab-host android-nested-fragment


【解决方案1】:

android Studio 附带的这个示例应用似乎已经过时了。我建议您使用DrawerLayout。您可以从 google here 找到官方示例。

如果您需要最新 API 的完整示例,请查看github sample

对于您的情况,DrawerActivityTabHolderFragmentTabFragment 的课程将很有趣。

【讨论】:

  • 我正在尝试将 github 示例方法应用到我的代码中,但我遇到了一些问题。我看到很多对名为 ButterKnife 的库的引用。我宁愿避免使用 3rd 方库,所以我试图解决各种 Butterknife 引用,但我不知道如何用传统的 Android 代码替换 @InjectView 引用,因为不清楚这些项目的作用。
  • 当我尝试运行修改后的代码并在以下行中实现您的示例时,我也会收到 NullPointerException: setNewRootFragment(StandardAppBarFragment.newInstance());在 DrawerActivity.java 类的 onCreate 中
  • 你能告诉我你修改过的代码吗,这样对我来说更容易帮助你。如果您不喜欢 butterKnife,请将其删除,并且每个注入的视图都必须在 onCreate 方法上按 id 查找主题。看看这里gist.github.com/swissonid/9f8ada12c7caee6fb4e7 - 我没有测试它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多