【问题标题】:Error inflating class android.support.v7.internal.widget.NativeActionModeAwareLayout膨胀类 android.support.v7.internal.widget.NativeActionModeAwareLayout 时出错
【发布时间】:2015-06-01 02:39:27
【问题描述】:

如果你以前解决过这个问题,请有人帮助我。

我正在尝试使用材料设计制作一些东西,以便应用程序可以低至 API 10 运行。我的代码没有任何错误,但我不断收到此错误。

Android LogCat

06-01 05:05:37.414: E/AndroidRuntime(7043): FATAL EXCEPTION: main
06-01 05:05:37.414: E/AndroidRuntime(7043): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.chano8.app/com.chano8.app.MainActivity}: android.view.InflateException: Binary XML file line #19: Error inflating class android.support.v7.internal.widget.NativeActionModeAwareLayout
06-01 05:05:37.414: E/AndroidRuntime(7043):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2351)
06-01 05:05:37.414: E/AndroidRuntime(7043):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2403)
06-01 05:05:37.414: E/AndroidRuntime(7043):     at android.app.ActivityThread.access$600(ActivityThread.java:165)
06-01 05:05:37.414: E/AndroidRuntime(7043):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1373)
06-01 05:05:37.414: E/AndroidRuntime(7043):     at android.os.Handler.dispatchMessage(Handler.java:107)
06-01 05:05:37.414: E/AndroidRuntime(7043):     at android.os.Looper.loop(Looper.java:194)
06-01 05:05:37.414: E/AndroidRuntime(7043):     at android.app.ActivityThread.main(ActivityThread.java:5370)
06-01 05:05:37.414: E/AndroidRuntime(7043):     at java.lang.reflect.Method.invokeNative(Native Method)
06-01 05:05:37.414: E/AndroidRuntime(7043):     at java.lang.reflect.Method.invoke(Method.java:525)
06-01 05:05:37.414: E/AndroidRuntime(7043):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
06-01 05:05:37.414: E/AndroidRuntime(7043):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
06-01 05:05:37.414: E/AndroidRuntime(7043):     at dalvik.system.NativeStart.main(Native Method)
06-01 05:05:37.414: E/AndroidRuntime(7043): Caused by: android.view.InflateException: Binary XML file line #19: Error inflating class android.support.v7.internal.widget.NativeActionModeAwareLayout
06-01 05:05:37.414: E/AndroidRuntime(7043):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:698)
06-01 05:05:37.414: E/AndroidRuntime(7043):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
06-01 05:05:37.414: E/AndroidRuntime(7043):     at android.view.LayoutInflater.parseInclude(LayoutInflater.java:805)
06-01 05:05:37.414: E/AndroidRuntime(7043):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:736)
06-01 05:05:37.414: E/AndroidRuntime(7043):     at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
06-01 05:05:37.414: E/AndroidRuntime(7043):     at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
06-01 05:05:37.414: E/AndroidRuntime(7043):     at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
06-01 05:05:37.414: E/AndroidRuntime(7043):     at android.support.v7.app.AppCompatDelegateImplV7.ensureSubDecor(AppCompatDelegateImplV7.java:324)
06-01 05:05:37.414: E/AndroidRuntime(7043):     at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:246)
06-01 05:05:37.414: E/AndroidRuntime(7043):     at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:106)
06-01 05:05:37.414: E/AndroidRuntime(7043):     at com.chano8.app.MainActivity.onCreate(MainActivity.java:33)
06-01 05:05:37.414: E/AndroidRuntime(7043):     at android.app.Activity.performCreate(Activity.java:5228)
06-01 05:05:37.414: E/AndroidRuntime(7043):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1150)
06-01 05:05:37.414: E/AndroidRuntime(7043):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2315)
06-01 05:05:37.414: E/AndroidRuntime(7043):     ... 11 more
06-01 05:05:37.414: E/AndroidRuntime(7043): Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.v7.internal.widget.NativeActionModeAwareLayout" on path: DexPathList[[zip file "/data/app/com.chano8.app-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.chano8.app-1, /vendor/lib, /system/lib]]
06-01 05:05:37.414: E/AndroidRuntime(7043):     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:53)
06-01 05:05:37.414: E/AndroidRuntime(7043):     at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
06-01 05:05:37.414: E/AndroidRuntime(7043):     at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
06-01 05:05:37.414: E/AndroidRuntime(7043):     at android.view.LayoutInflater.createView(LayoutInflater.java:552)
06-01 05:05:37.414: E/AndroidRuntime(7043):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)
06-01 05:05:37.414: E/AndroidRuntime(7043):     ... 24 more

以下是根据上述 Logcat 崩溃的代码。 MainActivity.java

private static String TAG = MainActivity.class.getSimpleName();
private Toolbar mToolbar;
private FragmentDrawer drawerFragment;

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

     mToolbar = (Toolbar) findViewById(R.id.toolbar);

        setSupportActionBar(mToolbar);
        getSupportActionBar().setDisplayShowHomeEnabled(true);

        drawerFragment = (FragmentDrawer)
                getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer);
        drawerFragment.setUp(R.id.fragment_navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout), mToolbar);
        drawerFragment.setDrawerListener(this);

        // display the first navigation drawer view on app launch
        displayView(0);

}

FragmentDrawer.java

这是绘制我需要的菜单的类。

private static String TAG = FragmentDrawer.class.getSimpleName();

private RecyclerView recyclerView;
private ActionBarDrawerToggle mDrawerToggle;
private DrawerLayout mDrawerLayout;
private NavigationDrawerAdapter adapter;
private View containerView;
private static String[] titles = null;
private FragmentDrawerListener drawerListener;

public FragmentDrawer() {

}

public void setDrawerListener(FragmentDrawerListener listener) {
    this.drawerListener = listener;
}

public static List<NavDrawerItem> getData() {
    List<NavDrawerItem> data = new ArrayList<>();


    // preparing navigation drawer items
    for (int i = 0; i < titles.length; i++) {
        NavDrawerItem navItem = new NavDrawerItem();
        navItem.setTitle(titles[i]);
        data.add(navItem);
    }
    return data;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // drawer labels
    titles = getActivity().getResources().getStringArray(R.array.nav_drawer_labels);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflating view layout
    View layout = inflater.inflate(R.layout.fragment_navigation_drawer, container, false);
    recyclerView = (RecyclerView) layout.findViewById(R.id.drawerList);

    adapter = new NavigationDrawerAdapter(getActivity(), getData());
    recyclerView.setAdapter(adapter);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), recyclerView, new ClickListener() {
        @Override
        public void onClick(View view, int position) {
            drawerListener.onDrawerItemSelected(view, position);
            mDrawerLayout.closeDrawer(containerView);
        }

        @Override
        public void onLongClick(View view, int position) {

        }
    }));

    return layout;
}

@SuppressLint("NewApi")
public void setUp(int fragmentId, DrawerLayout drawerLayout, final Toolbar toolbar) {
    containerView = getActivity().findViewById(fragmentId);
    mDrawerLayout = drawerLayout;
    mDrawerToggle = new ActionBarDrawerToggle(getActivity(), drawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close) {

        @Override
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            getActivity().invalidateOptionsMenu();
        }

        @Override
        public void onDrawerClosed(View drawerView) {
            super.onDrawerClosed(drawerView);
            getActivity().invalidateOptionsMenu();
        }

        @Override
        public void onDrawerSlide(View drawerView, float slideOffset) {
            super.onDrawerSlide(drawerView, slideOffset);
            toolbar.setAlpha(1 - slideOffset / 2);
        }
    };

    mDrawerLayout.setDrawerListener(mDrawerToggle);
    mDrawerLayout.post(new Runnable() {
        @Override
        public void run() {
            mDrawerToggle.syncState();
        }
    });

}

public static interface ClickListener {
    public void onClick(View view, int position);

    public void onLongClick(View view, int position);
}

static class RecyclerTouchListener implements RecyclerView.OnItemTouchListener {

    private GestureDetector gestureDetector;
    private ClickListener clickListener;

    @SuppressLint("NewApi")
    public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final ClickListener clickListener) {
        this.clickListener = clickListener;
        gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                return true;
            }

            @Override
            public void onLongPress(MotionEvent e) {
                View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
                if (child != null && clickListener != null) {
                    clickListener.onLongClick(child, recyclerView.getChildPosition(child));
                }
            }
        });
    }

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {

        View child = rv.findChildViewUnder(e.getX(), e.getY());
        if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {
            clickListener.onClick(child, rv.getChildPosition(child));
        }
        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {
    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean arg0) {
        // TODO Auto-generated method stub

    }
}

public interface FragmentDrawerListener {
    public void onDrawerItemSelected(View view, int position);
}

谢谢!

【问题讨论】:

  • 您是否将其包含在您的 gradle 中?好像你错过了它。此外,我没有看到包含您的 NativeActionModeAwareLayout 的代码。顺便说一句,使用全名也可能有帮助:android.support.v7.internal.widget.NativeActionModeAwareLayout

标签: java android


【解决方案1】:

创建一个新项目,设置 MIN 目标 id 10,将自动创建 appcompat_v7 库,然后将 appcompat_v7 添加为项目中的库。

我使用了import V7库,和你一样的错误,我用上面的方法解决了。

【讨论】:

    【解决方案2】:

    我已将该文件添加到我的项目中。 它正在工作!;

    NativeActionModeAwareLayout.java at AOSP

    package android.support.v7.internal.widget;
    
    import android.annotation.TargetApi;
    import android.content.Context;
    import android.os.Build;
    import android.util.AttributeSet;
    import android.view.ActionMode;
    import android.view.View;
    
    /**
     * @hide
     */
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public class NativeActionModeAwareLayout extends ContentFrameLayout {
    
        private OnActionModeForChildListener mActionModeForChildListener;
    
        public NativeActionModeAwareLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public void setActionModeForChildListener(OnActionModeForChildListener listener) {
            mActionModeForChildListener = listener;
        }
    
        public ActionMode startActionModeForChild(View originalView, ActionMode.Callback callback) {
            if (mActionModeForChildListener != null) {
                return mActionModeForChildListener.startActionModeForChild(originalView, callback);
            }
            return super.startActionModeForChild(originalView, callback);
        }
    
        /**
         * @hide
         */
        public interface OnActionModeForChildListener {
            ActionMode startActionModeForChild(View originalView, ActionMode.Callback callback);
        }
    }
    

    【讨论】:

    【解决方案3】:

    问题在于 v7 支持 lib 版本 - NativeActionModeAwareLayout 在 22.1.1 版本中,但在较新的 22.2.0 版本中没有。从 SDK manager 下载“support repository”,所有 v7 支持的 lib 版本都在哪里。

    【讨论】:

      猜你喜欢
      • 2017-07-06
      • 2014-10-18
      • 2015-01-06
      • 2017-07-29
      • 2014-12-21
      • 1970-01-01
      • 2017-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多