ClassCastException android.widget.FrameLayout $ LayoutParams to android.support.v4.widget.DrawerLayout $ LayoutParams

我正在为Android导航抽屉工作。 根据我的要求,我要显示导航抽屉中的项目的gridview和listview。 我在布局xml文件中创build了一个linearLayout,并将两个小部件(网格视图和Listview)放置在LinearLayout中。

当我运行该文件时出现以下错误:

java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.navigationdrawer3 / com.example.navigationdrawer3.MainActivity}:java.lang.ClassCastException:android.widget.FrameLayout $ LayoutParams不能转换为android.support.v4。 widget.DrawerLayout $的LayoutParams

下面是我的java,logcat和NavigationDrawer布局文件:

MainActivity.java

public class MainActivity extends Activity { private DrawerLayout mDrawerLayout; private ListView mDrawerList; private ActionBarDrawerToggle mDrawerToggle; private CharSequence mDrawerTitle; //@SuppressWarnings("unused") private CharSequence mTitle; private String[] mGalaxyTitles; private GridView mDrawerGrid; private LinearLayout mDrawerLinear; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTitle = mDrawerTitle = getTitle(); mGalaxyTitles = getResources().getStringArray(R.array.items_array); mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); mDrawerList = (ListView) findViewById(R.id.left_drawer); mDrawerGrid = (GridView)findViewById(R.id.gridview); mDrawerLinear =(LinearLayout)findViewById(R.id.linearLayout); mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); mDrawerGrid.setAdapter(new ImageAdapter(MainActivity.this)); mDrawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, mGalaxyTitles)); mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); getActionBar().setDisplayHomeAsUpEnabled(true); getActionBar().setHomeButtonEnabled(true); mDrawerToggle = new ActionBarDrawerToggle( this, mDrawerLayout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close ) { public void onDrawerClosed(View view) { getActionBar().setTitle(mDrawerTitle); invalidateOptionsMenu(); } public void onDrawerOpened(View drawerView) { getActionBar().setTitle(mDrawerTitle); invalidateOptionsMenu(); } }; mDrawerLayout.setDrawerListener(mDrawerToggle); if (savedInstanceState == null) { selectItem(0); } } class DrawerItemClickListener implements ListView.OnItemClickListener { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // TODO Auto-generated method stub switch(position){ case 0: menu0(); return; case 1: menu1(); return; case 2: menu2(); return; case 3: menu3(); return; case 4: menu4(); return; case 5: menu5(); return; case 6: menu6(); return; case 7: menu7(); return; case 8: menu8(); return; } } protected void menu0() { Intent Main0 = new Intent(MainActivity.this, Page0.class); startActivity(Main0); return; } protected void menu1() { Intent Main1 = new Intent(MainActivity.this, Page1.class); startActivity(Main1); return; } protected void menu2() { Intent Main2 = new Intent(MainActivity.this, Page2.class); startActivity(Main2); return; } protected void menu3() { Intent Main3 = new Intent(MainActivity.this, Page3.class); startActivity(Main3); return; } protected void menu4() { Intent Main4 = new Intent(MainActivity.this, Page4.class); startActivity(Main4); return; } protected void menu5() { Intent Main5 = new Intent(MainActivity.this, Page5.class); startActivity(Main5); return; } protected void menu6() { Intent Main6 = new Intent(MainActivity.this, Page6.class); startActivity(Main6); return; } protected void menu7() { Intent Main7 = new Intent(MainActivity.this, Page7.class); startActivity(Main7); return; } protected void menu8() { Intent Main8 = new Intent(MainActivity.this, Page8.class); startActivity(Main8); return; } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public void setTitle(CharSequence title) { mTitle = title; getActionBar().setTitle(mDrawerTitle); } @Override public boolean onPrepareOptionsMenu(Menu menu) { //boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList); //boolean drawerOpen2 = mDrawerLayout.isDrawerOpen(mDrawerGrid); boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerLayout); menu.findItem(R.id.action_settings).setVisible(!drawerOpen); //menu.findItem(R.id.action_settings).setVisible(!drawerOpen2); return super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (mDrawerToggle.onOptionsItemSelected(item)) { return true; } switch(item.getItemId()) { case R.id.action_settings: setting(); return true; case R.id.about: about(); return true; default: return super.onOptionsItemSelected(item); } } private void about() { // TODO Auto-generated method stub Intent Main1 = new Intent(MainActivity.this, About.class); startActivity(Main1); return; } private void setting() { // TODO Auto-generated method stub Intent Main1 = new Intent(MainActivity.this, Setting.class); startActivity(Main1); return; } private void selectItem(int position) { Fragment fragment = new GalaxyFragment(); Bundle args = new Bundle(); args.putInt(GalaxyFragment.ARG_GALAXY_NUMBER, position); fragment.setArguments(args); FragmentManager fragmentManager = getFragmentManager(); fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit(); mDrawerList.setItemChecked(position, true); setTitle(mGalaxyTitles[position]); mDrawerLayout.closeDrawer(mDrawerLayout); //mDrawerLayout.closeDrawer(mDrawerGrid); } class GalaxyFragment extends Fragment{ public static final String ARG_GALAXY_NUMBER = "galaxy_number"; public GalaxyFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.about, container, false); return rootView; } } //Gridview BaseAdapter class class ImageAdapter extends BaseAdapter{ Context context; ImageAdapter(Context context){ this.context = context; } @Override public int getCount() { // TODO Auto-generated method stub return mThumbIds.length; } @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int arg0) { // TODO Auto-generated method stub return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub ImageView imageView; if(convertView == null){ imageView = new ImageView(context); imageView.setLayoutParams(new GridView.LayoutParams(25, 25)); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); imageView.setPadding(8, 8, 8, 8); }else { imageView = (ImageView) convertView; } imageView.setImageResource(mThumbIds[position]); return imageView; } // references to our images private Integer[] mThumbIds = { R.drawable.sample_2, R.drawable.sample_3, R.drawable.sample_4, R.drawable.sample_5, }; } } 

activity_main.xml中

 <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" android:id="@+id/drawer_layout"> <FrameLayout android:id="@+id/content_frame" android:layout_width="match_parent" android:layout_height="match_parent" > </FrameLayout> <LinearLayout android:id="@+id/linearLayout" android:layout_width="320dp" android:layout_height="match_parent" android:orientation="vertical" android:layout_gravity="left" android:choiceMode="singleChoice" android:divider="@android:color/transparent" android:dividerHeight="0dp" android:background="#111"> <GridView android:id="@+id/gridview" android:layout_width="280dp" android:layout_height="match_parent" android:stretchMode="columnWidth" android:numColumns="auto_fit"/> <!-- android:gravity="center" --> <ListView android:id="@+id/left_drawer" android:layout_width="240dp" android:layout_height="match_parent" /> </LinearLayout> </android.support.v4.widget.DrawerLayout> 

logcat的

 07-30 06:15:57.203: W/dalvikvm(853): threadid=1: thread exiting with uncaught exception (group=0x40a71930) 07-30 06:15:57.213: E/AndroidRuntime(853): FATAL EXCEPTION: main 07-30 06:15:57.213: E/AndroidRuntime(853): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.navigationdrawer3/com.example.navigationdrawer3.MainActivity}: java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.support.v4.widget.DrawerLayout$LayoutParams 07-30 06:15:57.213: E/AndroidRuntime(853): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 07-30 06:15:57.213: E/AndroidRuntime(853): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 07-30 06:15:57.213: E/AndroidRuntime(853): at android.app.ActivityThread.access$600(ActivityThread.java:141) 07-30 06:15:57.213: E/AndroidRuntime(853): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 07-30 06:15:57.213: E/AndroidRuntime(853): at android.os.Handler.dispatchMessage(Handler.java:99) 07-30 06:15:57.213: E/AndroidRuntime(853): at android.os.Looper.loop(Looper.java:137) 07-30 06:15:57.213: E/AndroidRuntime(853): at android.app.ActivityThread.main(ActivityThread.java:5041) 07-30 06:15:57.213: E/AndroidRuntime(853): at java.lang.reflect.Method.invokeNative(Native Method) 07-30 06:15:57.213: E/AndroidRuntime(853): at java.lang.reflect.Method.invoke(Method.java:511) 07-30 06:15:57.213: E/AndroidRuntime(853): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 07-30 06:15:57.213: E/AndroidRuntime(853): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 07-30 06:15:57.213: E/AndroidRuntime(853): at dalvik.system.NativeStart.main(Native Method) 07-30 06:15:57.213: E/AndroidRuntime(853): Caused by: java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.support.v4.widget.DrawerLayout$LayoutParams 07-30 06:15:57.213: E/AndroidRuntime(853): at android.support.v4.widget.DrawerLayout.isDrawerView(DrawerLayout.java:809) 07-30 06:15:57.213: E/AndroidRuntime(853): at android.support.v4.widget.DrawerLayout.closeDrawer(DrawerLayout.java:1012) 07-30 06:15:57.213: E/AndroidRuntime(853): at com.example.navigationdrawer3.MainActivity.selectItem(MainActivity.java:265) 07-30 06:15:57.213: E/AndroidRuntime(853): at com.example.navigationdrawer3.MainActivity.onCreate(MainActivity.java:86) 07-30 06:15:57.213: E/AndroidRuntime(853): at android.app.Activity.performCreate(Activity.java:5104) 07-30 06:15:57.213: E/AndroidRuntime(853): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 07-30 06:15:57.213: E/AndroidRuntime(853): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 07-30 06:15:57.213: E/AndroidRuntime(853): ... 11 more 

第86行的代码行:

 selectItem(0); 

第265行的代码行:

 mDrawerLayout.closeDrawer(mDrawerLayout); 

我试图在很多方面纠正这个运行时错误,但是没有纠正。 任何人都可以为我的问题提出一个答案。

回答:

 mDrawerLayout.closeDrawer(mDrawerLayout); 

有错误的布局。 所以用drawerlayout改变它会解决。

为我解决了这个问题:

MainActivity ,为LinearLayout添加一个新字段,并在onCreate()为其赋值(这部分与emaleavilbuild议的一样 ):

 private LinearLayout linearLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ... linearLayout = (LinearLayout) findViewById(R.id.linearLayout); } 

然后在selectItem() ,当调用closeDrawer() ,只需传递linearLayout作为参数:

 drawerLayout.closeDrawer(linearLayout); 

我有同样的问题。 我刚摆脱使用,

 mDrawerLayout.closeDrawer(Gravity.LEFT); 

我有同样的问题…在我的情况下的解决scheme是:

在你的MainActivity中添加:

 private LinearLayout linearLayout; public void onCreate(Bundle savedInstanceState){ ... linearLayout = (LinearLayout)findViewById(R.id.linearLayout); ... } 

OnPrepareOptionsMenu:

 @Override public boolean onPrepareOptionsMenu(Menu menu) { boolean drawerOpen = mDrawerLayout.isDrawerOpen(this.linearLayout); menu.findItem(R.id.action_settings).setVisible(!drawerOpen); return super.onPrepareOptionsMenu(menu); } 

我为我可怜的英语感到抱歉。

我认为你应该把你的内容和抽屉完全放在手册里 。 现在XML结构不匹配。 请注意,只有“id”字段应匹配,视图types和参数可能会有所不同。

最后我find了在抽屉布局中实现自定义listView的方法。 这是帮助我做到这一点的post… http://www.michenux.net/android-navigation-drawer-748.html

 mDrawerLayout.closeDrawer(mDrawerLayout); 

要么

 mDrawerLayout.closeDrawer(Gravity.LEFT); 

两者都可以。注意:你必须知道什么是参数。

祝你今天愉快 !