您好我使用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>
答案 0 :(得分:0)
答案 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从未再次使用抽屉。