当前位置: 动力学知识库 > 问答 > 编程问答 >

android - Navigation Drawer xml error

问题描述:

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

}

}

网友答案:
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(...).

网友答案:

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
分享给朋友:
您可能感兴趣的文章:
随机阅读: