问题
Dear stackoverflowers,
I'm using navigation drawer inside my activity, here's the xml:
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<FrameLayout
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="#3a3a3c" >
<ImageView
android:id="@+id/ImageView01"
android:layout_width="240dp"
android:layout_height="10dp"
android:layout_marginTop="20dp"
android:src="@drawable/border" />
<TextView
android:id="@+id/tvretailers"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="0dp"
android:text="Retailers"
android:textColor="#ffffff"
android:textSize="20sp" />
<ImageView
android:id="@+id/imageView1"
android:layout_width="240dp"
android:layout_height="10dp"
android:layout_marginTop="300dp"
android:src="@drawable/border" />
<ListView
android:id="@+id/right_drawer_settings"
android:layout_width="wrap_content"
android:layout_height="250dp"
android:layout_marginTop="310dp"
android:background="#3a3a3c" >
</ListView>
<TextView
android:id="@+id/TextView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="280dp"
android:text="Settings"
android:textColor="#ffffff"
android:textSize="20sp" />
<ListView
android:id="@+id/right_drawer_retailers"
android:layout_width="wrap_content"
android:layout_height="200dp"
android:layout_marginTop="30dp"
android:background="#3a3a3c" >
</ListView>
</FrameLayout>
</android.support.v4.widget.DrawerLayout>
However, once i run the application i get an xml error:
08-18 01:36:47.751: E/AndroidRuntime(26527): FATAL EXCEPTION: main
08-18 01:36:47.751: E/AndroidRuntime(26527): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.androidarabia.phones/com.androidarabia.Lebanon.LebanonDrawer}: java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.support.v4.widget.DrawerLayout$LayoutParams
08-18 01:36:47.751: E/AndroidRuntime(26527): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2246)
08-18 01:36:47.751: E/AndroidRuntime(26527): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2296)
08-18 01:36:47.751: E/AndroidRuntime(26527): at android.app.ActivityThread.access$700(ActivityThread.java:151)
08-18 01:36:47.751: E/AndroidRuntime(26527): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1281)
08-18 01:36:47.751: E/AndroidRuntime(26527): at android.os.Handler.dispatchMessage(Handler.java:99)
08-18 01:36:47.751: E/AndroidRuntime(26527): at android.os.Looper.loop(Looper.java:137)
08-18 01:36:47.751: E/AndroidRuntime(26527): at android.app.ActivityThread.main(ActivityThread.java:5293)
08-18 01:36:47.751: E/AndroidRuntime(26527): at java.lang.reflect.Method.invokeNative(Native Method)
08-18 01:36:47.751: E/AndroidRuntime(26527): at java.lang.reflect.Method.invoke(Method.java:511)
08-18 01:36:47.751: E/AndroidRuntime(26527): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
08-18 01:36:47.751: E/AndroidRuntime(26527): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
08-18 01:36:47.751: E/AndroidRuntime(26527): at dalvik.system.NativeStart.main(Native Method)
08-18 01:36:47.751: E/AndroidRuntime(26527): Caused by: java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.support.v4.widget.DrawerLayout$LayoutParams
08-18 01:36:47.751: E/AndroidRuntime(26527): at android.support.v4.widget.DrawerLayout.isDrawerView(DrawerLayout.java:844)
08-18 01:36:47.751: E/AndroidRuntime(26527): at android.support.v4.widget.DrawerLayout.closeDrawer(DrawerLayout.java:1048)
08-18 01:36:47.751: E/AndroidRuntime(26527): at com.androidarabia.Lebanon.LebanonDrawer.selectItem(LebanonDrawer.java:104)
08-18 01:36:47.751: E/AndroidRuntime(26527): at com.androidarabia.Lebanon.LebanonDrawer.onCreate(LebanonDrawer.java:63)
08-18 01:36:47.751: E/AndroidRuntime(26527): at android.app.Activity.performCreate(Activity.java:5250)
08-18 01:36:47.751: E/AndroidRuntime(26527): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)
08-18 01:36:47.751: E/AndroidRuntime(26527): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2210)
08-18 01:36:47.751: E/AndroidRuntime(26527): ... 11 more
Before i had only one listview in the FrameLayout, and it worked properly, but after some modification i wasn't able to get it work! hope you can help! thanks alot stackoverflowers =)
Whole codes:
public class LebanonDrawer extends SherlockFragmentActivity {
DrawerLayout mDrawerLayout;
ListView mDrawerList;
ActionBarDrawerToggle mDrawerToggle;
String[] title;
String[] subtitle;
int[] icon;
Fragment Lebanon = new Lebanon();
@SuppressWarnings("unchecked")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.drawer_main);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.right_drawer_retailers);
String[] songsArray = { "Do", "RE", "MI", "FA", "SO", "LA", "SO" };
MenuListAdapter mla = new MenuListAdapter(this, songsArray);
mDrawerList.setAdapter(mla);
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.drawable.ic_drawer, R.string.drawer_open,
R.string.drawer_close) {
public void onDrawerClosed(View view) {
// TODO Auto-generated method stub
super.onDrawerClosed(view);
}
public void onDrawerOpened(View drawerView) {
// TODO Auto-generated method stub
super.onDrawerOpened(drawerView);
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
if (savedInstanceState == null) {
selectItem(0);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
if (mDrawerLayout.isDrawerOpen(mDrawerList)) {
mDrawerLayout.closeDrawer(mDrawerList);
} else {
mDrawerLayout.openDrawer(mDrawerList);
}
}
return super.onOptionsItemSelected(item);
}
private class DrawerItemClickListener implements
ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
selectItem(position);
}
}
private void selectItem(int position) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
// Locate Position
switch (position) {
case 0:
ft.replace(R.id.content_frame, Lebanon);
break;
}
ft.commit();
mDrawerList.setItemChecked(position, true);
// Close drawer
mDrawerLayout.closeDrawer(mDrawerList);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Pass any configuration change to the drawer toggles
mDrawerToggle.onConfigurationChanged(newConfig);
}
}
回答1:
Caused by: java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams
cannot be cast to android.support.v4.widget.DrawerLayout$LayoutParams
In your xml layout, mDrawerList
is not a direct descendant of DrawerLayout
. Instead, its a descendant of FrameLayout
whose LayoutParams are being used.
In your current setup, assign an id to the FrameLayout that holds the ListView, find it in your activity, and use it in:
mDrawerLayout.openDrawer(frameHoldingListView);
Make similar changes for mDrawerLayout.closeDrawer(...) and mDrawerLayout.isDrawerOpen(...).
回答2:
If somebody has a similar problem using Toolbar and:
mDrawerLayout.openDrawer(mDrawerLayout);
by following the training at developer.android.com
Try:
mDrawerLayout.openDrawer(Gravity.LEFT);
To save a lot of time searching for the exception's solution:
java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams
cannot be cast to android.support.v4.widget.DrawerLayout$LayoutParams
来源:https://stackoverflow.com/questions/18293962/navigation-drawer-xml-error