Android 从导航抽屉单击时未加载碎片

Android 从导航抽屉单击时未加载碎片,android,android-studio,android-fragments,androiddesignsupport,Android,Android Studio,Android Fragments,Androiddesignsupport,嗨,我用android studio向导创建了一个抽屉活动。在Mainnacity中,我输入了以下代码: @Override public boolean onNavigationItemSelected(MenuItem item) { // Handle navigation view item clicks here. int id = item.getItemId(); if (id == R.id.nav_movies) {

嗨,我用android studio向导创建了一个抽屉活动。在Mainnacity中,我输入了以下代码:

@Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        if (id == R.id.nav_movies) {
            Fragment newDetail = ListFragment.newInstance(LAUNCH_MOVIES);
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.container, newDetail)
                    .commit();

        } else if (id == R.id.nav_tv) {
            Fragment newDetail = ListFragment.newInstance(LAUNCH_TV);
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.container, newDetail)
                    .commit();
        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }
因为我有两个选项,我需要用不同的参数启动同一个片段,并且基于不同的参数,片段显示不同的东西。但当我点击导航抽屉项目时,屏幕上和stacktrace上都没有显示任何内容

列表片段:

public static ListFragment newInstance(int target) {
        Bundle args = new Bundle();
        args.putInt(ARG_SCOPE, target);
        ListFragment fragment = new ListFragment();
        fragment.setArguments(args);
        return fragment;
    }

    public ListFragment() {
    }



    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        scope = getArguments().getInt(ARG_SCOPE);
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.content_main, container, false);

        switch (scope){
            case 1:
                //launch Movies
                ((TextView)rootView.findViewById(R.id.textView)).setText("" + MainActivity.LAUNCH_MOVIES);
                break;
            case 2:
                //Launch tv
                ((TextView)rootView.findViewById(R.id.textView)).setText("" + MainActivity.LAUNCH_TV);
                break;
            default:
                Log.w(LOG_TAG, "INVALID SCOPE");
        }

        return rootView;
    }
谢谢你,我快疯了

XML文件: 主要活动

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

    <include
        layout="@layout/app_bar_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

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

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

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

        <android.support.v7.widget.Toolbar
            .../>

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

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/container"/>

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

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"/>
</RelativeLayout>

app\u bar\u main

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

    <include
        layout="@layout/app_bar_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

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

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

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

        <android.support.v7.widget.Toolbar
            .../>

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

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/container"/>

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

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"/>
</RelativeLayout>

主要内容

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

    <include
        layout="@layout/app_bar_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

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

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

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

        <android.support.v7.widget.Toolbar
            .../>

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

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/container"/>

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

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"/>
</RelativeLayout>


您是否尝试过Debugger?您可以使用断点查看代码流。

我认为如果您使用Android Studio调试器逐行进行调试,您可能会发现您的问题。我觉得一切都很好,但我看不到所有的代码或XML。 MainActivity.LAUNCH\u电视和MainActivity.LAUNCH\u电影返回什么?它们可能什么也不返回,给您留下一个空文本视图,因此按钮似乎不起作用。 另一个问题可能是R.id.nav_电影和R.id.nav_电视不正确,但我无法判断,因为您的所有XML都不包括在内。
将调试器设置为在onNavigationItemSelected的第一行中断,一次只执行一行,一旦知道问题所在,问题应该会更容易解决。

听起来好像没有调用您的
导航视图
。您是否已将侦听器设置为您的
导航视图

navigationView.setNavigationItemSelectedListener(listener);

我尝试了您的方法。您面临的问题是替换片段id。您应该在替换片段时使用content_main.xml文件中的Relativelayout id

        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.content_main, fragment).commit(); 

同时从app_bar_main.xml文件中删除Framelayout。

我能够让它工作。显然,这是xml文件组织方式中的一些缺陷。java代码保持原样。相反,在
app\u bar\u main
中,我在协调器布局内部放置了一个id为
@+id/fragment\u容器的框架布局。我还删除了自己生成的
标记

在onNavigationItemSelected方法中,我更新了every.replace()以针对新的框架布局,如下所示:
.replace(R.id.fragment\u container,newDetail)

然后在片段的onCreateView中,我膨胀了一个新布局,如下所示:
View rootView=inflater.inflate(R.layout.fragment\u列表,container,false),其中fragment_list是我拥有recycerView和所有UI内容的布局

content\u main.xml
未使用


我相信这个bug某种程度上与
标签和添加抽屉的凌乱而复杂的方式有关。2/10不再使用抽屉。

MainActivity.LAUNCH\u电视和电影是两个整数常量。一个是=1,另一个是=2。开关的默认情况应该给出一个警告日志,但它不会发生,因此要么没有调用开关情况,要么没有创建整个片段。R.id.nav_电影和电视都很好,否则我会得到stacktrace。我尝试记录所有内容,但我在调试器方面运气不好。您建议将断点放在何处?首先,您可以尝试放置
onNavigationItemSelected(MenuItem)
方法,以便查看这些方法正在调用的断点(在代码的第一行,而不是mehod),然后使用
F9
可以自动转到下一行执行的断点。通常将断点放在需要调用代码的地方。编辑:你是不是为了听点击事件而给meniu充气?你说的充气是什么意思?我通过Android Studio创建了一个抽屉活动,所以我想一切都已经安排好了。在这种情况下,它应该会安排好。。请使用MainActivity代码更新您的问题。我很想知道为什么我的问题被否决,并且没有添加解决方案。正如我所说,该活动是通过As重新创建的,事实上,这一行在MainActivity#onCreate中存在<代码>导航视图导航视图=(导航视图)findViewById(R.id.nav_视图);navigationView.setNavigationItemSelectedListener(此)这就更接近解决方案了:如果我将框架布局改为框架布局,然后按照您所说的做其余的工作,它就会工作。然后我把碎片放在content_main.xml中,我用充气器充气。如果我尝试在onCreateView中加载另一个xml文件,我会再次看到一个黑屏。