Android - 添加子菜单时应用程序崩溃

标签 android

我尝试在产品上添加子菜单,但应用程序在启动时崩溃了。问题来自创建的子菜单。我不明白为什么。

导航菜单.xml

   <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@+id/nav_home"
        android:title="Home" />

        <item android:title="Products"
            android:id="@+id/nav_products">
            <menu>

                <item android:id="@+id/nav_tubeBendingMachines"
                    android:title="Tub" />

                <item android:id="@+id/nav_sectionBendingRolls"
                    android:title="Sect" />

            </menu>
         </item>


    <item android:id="@+id/nav_tube_data"
        android:title="Tube Data" />

    <item android:id="@+id/nav_tool_setup"
        android:title="Tool Setup" />

    <item android:id="@+id/nav_mandrel"
        android:title="Mandrel" />

    <item android:id="@+id/nav_archive"
        android:title="Archive" />

    <item android:id="@+id/nav_tool_notes"
        android:title="Tool Notes" />

    <item android:id="@+id/nav_converter"
        android:title="Converter" />

    <item android:id="@+id/nav_bend_guide"
        android:title="Bend Guide" />

    <item android:id="@+id/nav_contact"
        android:title="Contact Us" />

    <item android:id="@+id/nav_settings"
        android:title="Settings"
        android:icon="@mipmap/ic_settings_black_24dp"/>


    </menu>

主要

public class MainActivity extends AppCompatActivity {

//Side menu
private DrawerLayout mDrawerLayout;
//button side menu
private ActionBarDrawerToggle mToggle;

//toolbar
private Toolbar mToolbar;

//Fragments
FragmentTransaction fragmentTransaction;

NavigationView navigationView;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mToolbar = (Toolbar) findViewById(R.id.nav_action);
    setSupportActionBar(mToolbar);


    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
    mToggle = new ActionBarDrawerToggle(this,mDrawerLayout, R.string.open,R.string.close);

    mDrawerLayout.addDrawerListener(mToggle);
    mToggle.syncState();

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    //fragments transaction
    fragmentTransaction = getSupportFragmentManager().beginTransaction();
    fragmentTransaction.add(R.id.main_container,new HomeFragment());
    fragmentTransaction.commit();
    getSupportActionBar().setTitle("Home");

    //select which fragment to show based on item id
    navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch (item.getItemId())
            {
                case R.id.nav_home:
                    fragmentTransaction = getSupportFragmentManager().beginTransaction();
                    fragmentTransaction.replace(R.id.main_container,new HomeFragment());
                    fragmentTransaction.commit();
                    getSupportActionBar().setTitle("Home");
                    item.setChecked(true);
                    mDrawerLayout.closeDrawers();
                    break;

                case R.id.nav_settings:
                    fragmentTransaction = getSupportFragmentManager().beginTransaction();
                    fragmentTransaction.replace(R.id.main_container,new SettingsFragment());
                    fragmentTransaction.commit();
                    getSupportActionBar().setTitle("Settings");
                    item.setChecked(true);
                    mDrawerLayout.closeDrawers();
                    break;

                case R.id.nav_contact:
                    fragmentTransaction = getSupportFragmentManager().beginTransaction();
                    fragmentTransaction.replace(R.id.main_container,new ContactUsFragment());
                    fragmentTransaction.commit();
                    getSupportActionBar().setTitle("Contact Us");
                    item.setChecked(true);
                    mDrawerLayout.closeDrawers();
                    break;

                case R.id.nav_tube_data:
                    fragmentTransaction = getSupportFragmentManager().beginTransaction();
                    fragmentTransaction.replace(R.id.main_container,new TubeDataFragment());
                    fragmentTransaction.commit();
                    getSupportActionBar().setTitle("Tube Data");
                    item.setChecked(true);
                    mDrawerLayout.closeDrawers();
                    break;

                case R.id.nav_archive:
                    fragmentTransaction = getSupportFragmentManager().beginTransaction();
                    fragmentTransaction.replace(R.id.main_container,new ArchiveFragment());
                    fragmentTransaction.commit();
                    getSupportActionBar().setTitle("Archive");
                    item.setChecked(true);
                    mDrawerLayout.closeDrawers();
                    break;

                case R.id.nav_bend_guide:
                    fragmentTransaction = getSupportFragmentManager().beginTransaction();
                    fragmentTransaction.replace(R.id.main_container,new BendGuideFragment());
                    fragmentTransaction.commit();
                    getSupportActionBar().setTitle("Bend Guide");
                    item.setChecked(true);
                    mDrawerLayout.closeDrawers();
                    break;

                case R.id.nav_mandrel:
                    fragmentTransaction = getSupportFragmentManager().beginTransaction();
                    fragmentTransaction.replace(R.id.main_container,new MandrelFragment());
                    fragmentTransaction.commit();
                    getSupportActionBar().setTitle("Mandrel");
                    item.setChecked(true);
                    mDrawerLayout.closeDrawers();
                    break;

                case R.id.nav_tool_setup:
                    fragmentTransaction = getSupportFragmentManager().beginTransaction();
                    fragmentTransaction.replace(R.id.main_container,new ToolSetupFragment());
                    fragmentTransaction.commit();
                    getSupportActionBar().setTitle("Tool Setup");
                    item.setChecked(true);
                    mDrawerLayout.closeDrawers();
                    break;

                case R.id.nav_products:
                    fragmentTransaction = getSupportFragmentManager().beginTransaction();
                    fragmentTransaction.replace(R.id.main_container,new ProductsFragment());
                    fragmentTransaction.commit();
                    getSupportActionBar().setTitle("Products");
                    item.setChecked(true);
                    mDrawerLayout.closeDrawers();
                    break;





            }
            return true;
        }
    });

    }
//toggle para o menu
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if(mToggle.onOptionsItemSelected(item))
        {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

崩溃日志:

04-20 10:40:45.923 6040-6040/com.example.tiagosilva.amob_android E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.tiagosilva.amob_android, PID: 6040
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.tiagosilva.amob_android/com.example.tiagosilva.amob_android.MainActivity}: android.view.InflateException: Binary XML file line #38: Binary XML file line #38: Error inflating class android.support.design.widget.NavigationView
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
    at android.app.ActivityThread.-wrap12(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6119)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
 Caused by: android.view.InflateException: Binary XML file line #38: Binary XML file line #38: Error inflating class android.support.design.widget.NavigationView
 Caused by: android.view.InflateException: Binary XML file line #38: Error inflating class android.support.design.widget.NavigationView
 Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Constructor.newInstance0(Native Method)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:430)
    at android.view.LayoutInflater.createView(LayoutInflater.java:645)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:787)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:858)
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:821)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:518)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:426)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:377)
    at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:292)
    at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140)
    at com.example.tiagosilva.amob_android.MainActivity.onCreate(MainActivity.java:34)
    at android.app.Activity.performCreate(Activity.java:6679)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
    at android.app.ActivityThread.-wrap12(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6119)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
 Caused by: java.lang.ClassCastException: android.support.design.internal.NavigationMenuPresenter$NavigationMenuSeparatorItem cannot be cast to android.support.design.internal.NavigationMenuPresenter$NavigationMenuTextItem
    at android.support.design.internal.NavigationMenuPresenter$NavigationMenuAdapter.appendTransparentIconIfMissing(NavigationMenuPresenter.java:540)
    at android.support.design.internal.NavigationMenuPresenter$NavigationMenuAdapter.prepareMenuItems(NavigationMenuPresenter.java:527)
    at android.support.design.internal.NavigationMenuPresenter$NavigationMenuAdapter.update(NavigationMenuPresenter.java:460)
    at android.support.design.internal.NavigationMenuPresenter.updateMenuView(NavigationMenuPresenter.java:117)
    at android.support.design.widget.NavigationView.inflateMenu(NavigationView.java:252)
04-20 10:40:45.923 6040-6040/com.example.tiagosilva.amob_android E/AndroidRuntime:     
    at android.support.design.widget.NavigationView.<init>(NavigationView.java:174)
    at android.support.design.widget.NavigationView.<init>(NavigationView.java:100)
        ... 25 more

最佳答案

Caused by: android.view.InflateException: Binary XML file line #38: Binary XML file line #38: Error inflating class android.support.design.widget.NavigationView

Caused by: android.view.InflateException: Binary XML file line #38: Error inflating class android.support.design.widget.NavigationView

原因:

问题出在您的 NavigationMenu.xml 中。项目 nav_settings 导致 InflateException。这是因为这个 itemicon 但上面的 items 没有 icons 而你没有 将它们组合在一起

解决方案:

要解决此 InflateException,请将菜单项 nav_tube_datanav_contact 放入 group 中,您还必须给 group 一个 id

这是有效的 XML 代码:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@+id/nav_home"
        android:title="Home" />

    <item android:title="Products"
        android:id="@+id/nav_products">
        <menu>
            <item android:id="@+id/nav_tubeBendingMachines"
                android:title="Tub" />

            <item android:id="@+id/nav_sectionBendingRolls"
                android:title="Sect" />
        </menu>
    </item>

    <group
        android:checkableBehavior="none"
        android:id="@+id/group_one">

        <item android:id="@+id/nav_tube_data"
            android:title="Tube Data" />

        <item android:id="@+id/nav_tool_setup"
            android:title="Tool Setup" />

        <item android:id="@+id/nav_mandrel"
            android:title="Mandrel" />

        <item android:id="@+id/nav_archive"
            android:title="Archive" />

        <item android:id="@+id/nav_tool_notes"
            android:title="Tool Notes" />

        <item android:id="@+id/nav_converter"
            android:title="Converter" />

        <item android:id="@+id/nav_bend_guide"
            android:title="Bend Guide" />

        <item android:id="@+id/nav_contact"
            android:title="Contact Us" />
    </group>

    <item android:id="@+id/nav_settings"
        android:title="Settings"
        android:icon="@drawable/ic_settings_black_24dp"/>

</menu>

输出:

enter image description here

一个建议不要将资源icons 放在mipmap 文件夹中。 mipmap 仅适用于 launcher 图标。对于其他 resource 图标,您应该使用 drawable 文件夹。

更新:

I wanted to click Products and it goes to the page showing all the items related to Products. There is no way to make Products clickable like the other items like Home, etc...?

试试这个:

    ..................
    .............................
    <group
        android:checkableBehavior="none"
        android:id="@+id/group_two">

        <item android:title="Products"
            android:id="@+id/nav_products" />

        <item android:id="@+id/nav_tubeBendingMachines"
            android:title="Tub" />

        <item android:id="@+id/nav_sectionBendingRolls"
            android:title="Sect" />
    </group>
    ................
    .......................

希望对你有帮助~

关于Android - 添加子菜单时应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43517206/

相关文章:

c# - PCL中隔离存储的跨平台解决方案?

Java 位图改变色调

android - Fragment 中 AyncTask 中的 ProgressDialog(崩溃)

java - 如何使用 Socket 从 Android 向 Windows 中的 python 应用程序发送消息

android - 启动新 Activity 时出错

android - 使用 OkHttp 缓存 POST 请求

android - 原因 : com. android.dex.DexException : Multiple dex files define Lorg/apache/commons/io/IOCase in Studio 3. 0

android - Android 中的短信文本计数器

javascript - shouldOverrideUrlLoading 仅针对某些网页被调用

java - Exoplayer 不在本地存储上播放本地文件