从航空抽屉

时间:2016-09-11 21:17:20

标签: android android-studio android-fragments androiddesignsupport

您好我使用android studio向导创建抽屉活动。在MainnActivity里面我已经把这段代码写了:

@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;
    }

由于我有2个选项,我需要使用不同的参数启动相同的片段,并且基于不同的参数,片段显示不同的内容。但是,当我点击导航抽屉时,屏幕上和堆栈跟踪上都没有显示任何内容。

ListFragment:

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文件: 的 activity_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>

app_bar_main

<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>

content_main

<RelativeLayout
    ...>

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

5 个答案:

答案 0 :(得分:0)

你试过Debuger吗?您可以使用断点查看代码流。

答案 1 :(得分:0)

我认为如果您使用Android Studio调试程序逐行执行,您可能会发现问题所在。一切似乎都很好,但我看不到所有的代码或XML。 MainActivity.LAUNCH_TV和MainActivity.LAUNCH_MOVIES返回什么?他们可能没有返回任何内容,并留下一个空的文本视图,因此它可能看起来像按钮不起作用。 另一个问题可能是R.id.nav_movies和R.id.nav_tv不对,但我无法分辨,因为所有的XML都没有包含在内。 将调试器设置为onNavigationItemSelected的第一行中断,并且一次只执行一行,一旦知道问题,问题就会变得更容易解决。

答案 2 :(得分:0)

听起来你的navigationView setNavigationItemSelectedListener没有被调用。您是否已将听众设为navigationView

navigationView.setNavigationItemSelectedListener(listener);

答案 3 :(得分:0)

我尝试了你的方法。你面临的问题是替换片段id。你应该使用来自content_main.xml文件的Relativelayout id,同时替换片段

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

还从app_bar_main.xml文件中删除Framelayout。

答案 4 :(得分:0)

我能够让它运转起来。可能这是xml文件组织方式的一些错误。 java代码保持原样。而在app_bar_main中,在协调器布局中,我放置了一个ID为@+id/fragment_container的FrameLayout。我还删除了自生成的<Include content_main.xml>标记。

在onNavigationItemSelected方法中,我更新了每个.replace()以定位新的FrameLayout,如下所示:.replace(R.id.fragment_container, newDetail)

然后在片段的onCreateView中我膨胀了一个新的布局:View rootView = inflater.inflate(R.layout.fragment_list, container, false);,其中fragment_list是我有recycerView和所有UI东西的布局。

content_main.xml未使用。

我认为这个错误与<include>标签以及添加抽屉的混乱过于复杂的方式有某种关联。 2/10从未再次使用抽屉。