【发布时间】:2016-04-05 16:37:46
【问题描述】:
我正在尝试创建一个包含 ListView 的自定义 DrawerLayout,但我无法使其正常工作。在包装 LinearLayout 的内容之前,我能够使其工作,以便能够使其更加自定义并在 ListView 上方添加一个图像。
当我在传递 linearLayout 时尝试 closeDrawer() 时,我一直遇到这个异常,我已经看到多篇关于此类问题的帖子,但大多数人的解决方法是将 LinearLayout 传递给 closeDrawer() 函数,我已经这样做了:
04-05 12:17:10.100 18879-18879/com.plante.android.cobalt E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.plante.android.cobalt, PID: 18879
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.plante.android.cobalt/com.plante.android.cobalt.activityv2.ActivityHome}: java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.support.v4.widget.DrawerLayout$LayoutParams
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.support.v4.widget.DrawerLayout$LayoutParams
at android.support.v4.widget.DrawerLayout.isDrawerView(DrawerLayout.java:1415)
at android.support.v4.widget.DrawerLayout.closeDrawer(DrawerLayout.java:1630)
at com.plante.android.cobalt.activityv2.ActivityHome.selectItem(ActivityHome.java:190)
at com.plante.android.cobalt.activityv2.ActivityHome.onCreate(ActivityHome.java:155)
at android.app.Activity.performCreate(Activity.java:6251)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
这是我的活动:
@Bind(R.id.drawer_layout)
DrawerLayout mDrawerLayout;
@Bind(R.id.actionToolbar)
Toolbar toolbar;
@Bind(R.id.left_drawer_item)
LinearLayout mDrawerLinear;
@Bind(R.id.left_drawer_child)
ListView mDrawerListChild;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_v2_home);
ButterKnife.bind(this);
setSupportActionBar(toolbar);
getSupportActionBar().setTitle(getResources().getString(R.string.app_name));
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
mPlanTitles = getResources().getStringArray(R.array.plan_list);
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
// set up the drawer's list view with items and click listener
ArrayList<String> myList = new ArrayList<>();
myList.add("First Item");
myList.add("Second Item");
mDrawerListChild.setAdapter(new DrawerListAdapter(this, R.layout.drawer_layout_item, myList));
mDrawerListChild.setOnItemClickListener(new DrawerItemClickListener());
// enable ActionBar app icon to behave as action to toggle nav drawer
mDrawerToggle = new ActionBarDrawerToggle(
this, /* host Activity */
mDrawerLayout, /* DrawerLayout object */
toolbar, /* nav drawer image to replace 'Up' caret */
R.string.drawer_open, /* "open drawer" description for accessibility */
R.string.drawer_close /* "close drawer" description for accessibility */
) {
public void onDrawerClosed(View view) {
//syncActionBarArrowState();
}
public void onDrawerOpened(View drawerView) {
//mDrawerToggle.setDrawerIndicatorEnabled(true);
}
};
getSupportFragmentManager().addOnBackStackChangedListener(mOnBackStackChangedListener);
mDrawerLayout.setDrawerListener(mDrawerToggle);
setSupportActionBar(toolbar);
user = getUser();
if (savedInstanceState == null) {
selectItem(0);
}
}
private void selectItem(int position) {
BackHandledFragment fragment = new FragmentMobilePlan();
setSelectedFragment(fragment);
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.pull_in_right, R.anim.push_out_left, R.anim.pull_in_left, R.anim.push_out_right);
ft.replace(R.id.content_frame, fragment)
.commit();
// update selected item and title, then close the drawer
mDrawerListChild.setItemChecked(position, true);
setTitle(mPlanTitles[position]);
mDrawerLayout.closeDrawer(mDrawerLinear);
}
这是我的布局:
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<include layout="@layout/action_bar" />
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<LinearLayout
android:id="@+id/left_drawer_item"
android:layout_width="200dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:orientation="vertical">
<ImageView
android:id="@+id/profilIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_people1blue2x" />
<ListView
android:id="@+id/left_drawer_child"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
android:background="#111" />
</LinearLayout>
</LinearLayout>
</android.support.v4.widget.DrawerLayout>
【问题讨论】:
-
你的抽屉布局 xml 在哪里?
-
@Ben-J 我加了,因为帖子有空格,没显示
-
@WilderPereira 我已经看过那个帖子但没有帮助,我尝试了 mDrawerLayout.closeDrawer(Gravity.LEFT);而且我没有将drawerLayout本身传递给closeDrawer,所以这不是我的问题
标签: android android-layout navigation-drawer