【问题标题】:Resource cannot be found, No identifier for missing item找不到资源,没有缺少项目的标识符
【发布时间】:2014-05-20 15:44:36
【问题描述】:

我查看了这个问题,但它并没有帮助解决我的问题:

我在我的应用程序中使用 ActionBarSherlock(4.4 版)以与旧版本兼容。我的应用程序在 4.1.2 上运行完美,但在 2.3.3 上崩溃。该应用程序一直运行到mDrawerLayout.closeDrawer(mDrawerList);,然后它崩溃了。我无法弄清楚是什么导致它在旧版本上崩溃。我有一种感觉,这是因为它试图使用该版本中不存在的东西,但是,我无法确定它在使用什么。有没有人看到任何看起来错误的代码?

logcat 中的错误: Caused by: android.content.res.Resources$NotFoundException: Resource is not a Drawable (color or path): TypedValue{t=0x2/d=0x10102fd a=-1}

Logcat 错误

08-15 21:01:04.967: E/AndroidRuntime(789): FATAL EXCEPTION: main
08-15 21:01:04.967: E/AndroidRuntime(789): android.view.InflateException: Binary XML file line #17: Error inflating class <unknown>
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.view.LayoutInflater.createView(LayoutInflater.java:518)
08-15 21:01:04.967: E/AndroidRuntime(789):  at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:568)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.view.LayoutInflater.inflate(LayoutInflater.java:386)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:332)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.widget.ArrayAdapter.getView(ArrayAdapter.java:323)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.widget.AbsListView.obtainView(AbsListView.java:1430)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.widget.ListView.makeAndAddView(ListView.java:1745)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.widget.ListView.fillDown(ListView.java:670)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.widget.ListView.fillFromTop(ListView.java:727)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.widget.ListView.layoutChildren(ListView.java:1598)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.widget.AbsListView.onLayout(AbsListView.java:1260)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.view.View.layout(View.java:7175)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:702)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.view.View.layout(View.java:7175)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.view.View.layout(View.java:7175)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1047)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.view.View.layout(View.java:7175)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.view.View.layout(View.java:7175)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.view.View.layout(View.java:7175)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.view.ViewRoot.performTraversals(ViewRoot.java:1140)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.os.Handler.dispatchMessage(Handler.java:99)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.os.Looper.loop(Looper.java:123)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.app.ActivityThread.main(ActivityThread.java:3683)
08-15 21:01:04.967: E/AndroidRuntime(789):  at java.lang.reflect.Method.invokeNative(Native Method)
08-15 21:01:04.967: E/AndroidRuntime(789):  at java.lang.reflect.Method.invoke(Method.java:507)
08-15 21:01:04.967: E/AndroidRuntime(789):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-15 21:01:04.967: E/AndroidRuntime(789):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-15 21:01:04.967: E/AndroidRuntime(789):  at dalvik.system.NativeStart.main(Native Method)
08-15 21:01:04.967: E/AndroidRuntime(789): Caused by: java.lang.reflect.InvocationTargetException
08-15 21:01:04.967: E/AndroidRuntime(789):  at java.lang.reflect.Constructor.constructNative(Native Method)
08-15 21:01:04.967: E/AndroidRuntime(789):  at java.lang.reflect.Constructor.newInstance(Constructor.java:415)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.view.LayoutInflater.createView(LayoutInflater.java:505)
08-15 21:01:04.967: E/AndroidRuntime(789):  ... 35 more
08-15 21:01:04.967: E/AndroidRuntime(789): Caused by: android.content.res.Resources$NotFoundException: Resource is not a Drawable (color or path): TypedValue{t=0x2/d=0x10102fd a=-1}
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.content.res.Resources.loadDrawable(Resources.java:1681)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.view.View.<init>(View.java:1951)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.widget.TextView.<init>(TextView.java:344)
08-15 21:01:04.967: E/AndroidRuntime(789):  at android.widget.TextView.<init>(TextView.java:337)
08-15 21:01:04.967: E/AndroidRuntime(789):  ... 38 more

values 文件夹中的styles.xml:

<resources>
    <style name="AppBaseTheme" parent="Theme.Sherlock.Light.DarkActionBar">
    </style>

    <style name="AppTheme" parent="AppBaseTheme">
    </style>
</resources>

Java 文件

protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        setTheme(R.style.Theme_Sherlock);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG,"Set Content View");

        mTitle = (String) getTitle();  
        ChemTitles = getResources().getStringArray(R.array.chemistrycalcstrings);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.left_drawer);

        mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
        mDrawerList.setAdapter(new ArrayAdapter<String>(this,
                R.layout.drawer_list_item, ChemTitles));
        mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        Log.d(TAG,"Set Display Home");
        getSupportActionBar().setHomeButtonEnabled(true);
        Log.d(TAG,"Set Home Button");
        Log.d(TAG,"Setting ActbarDrawerToggle");
        mDrawerToggle = new ActionBarDrawerToggle(
                this, 
                mDrawerLayout, 
                R.drawable.ic_drawer, 
                R.string.drawer_open, 
                R.string.drawer_close
                ) {
            public void onDrawerClosed(View view){
                getSupportActionBar().setTitle(mTitle);
                getSherlock().dispatchInvalidateOptionsMenu();
                Log.d(TAG,"Drawer CLosing");
            }

            public void onDrawerOpened(View drawerView){
                getSupportActionBar().setTitle(mDrawerTitle);
                getSherlock().dispatchInvalidateOptionsMenu();
                Log.d(TAG,"Drawer Opening");
            }
        };
        Log.d(TAG,"Set ActbarDrawerToggle");
        mDrawerLayout.setDrawerListener(mDrawerToggle);
        Log.d(TAG,"Set ActbarDrawerToggle Listener");

        if (savedInstanceState == null){
            selectItem(0);
        }
}

private void selectItem(int position){

    SherlockFragment frag = new TestFrament();
    Bundle args = new Bundle();
    args.putInt(TestFrament.ITEM_SEL, position);
    frag.setArguments(args);
    getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, frag).commit();
    mDrawerList.setItemChecked(position, true);
    setTitle(ChemTitles[position]);
    mDrawerLayout.closeDrawer(mDrawerList);
}

编辑/更新

我浏览并注释掉了涉及列表视图mDrawerList 的所有部分,应用程序立即启动,操作栏工作正常,但抽屉中没有列表视图。

布局activity_main.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">

    <!-- As the main content view, the view below consumes the entire
         space available using match_parent in both dimensions. -->
    <LinearLayout
        android:id="@+id/content_frame"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <!-- android:layout_gravity="start" tells DrawerLayout to treat
         this as a sliding drawer on the left side for left-to-right
         languages and on the right side for right-to-left languages.
         The drawer is given a fixed width in dp and extends the full height of
         the container. A solid background is used for contrast
         with the content view. -->
    <ListView
        android:id="@+id/left_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp"
        android:background="#111"/>
</android.support.v4.widget.DrawerLayout>

drawer_list_item.xml

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceListItemSmall"
    android:gravity="center_vertical"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:textColor="#fff"
    android:background="?android:attr/activatedBackgroundIndicator"
    android:minHeight="?android:attr/listPreferredItemHeightSmall"/>

test_fragment_layout.xml

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragTextSherlock"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFFFF"
    android:gravity="center"
    android:padding="32dp" />

TestFragment.java

public class TestFrament extends SherlockFragment {
    public static final String ITEM_SEL = "item_selected";
    private TextView fragtv;

    public TestFrament() {
        // Empty constructor required for fragment subclasses
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.test_fragment_layout, container, false);
        int i = getArguments().getInt(ITEM_SEL);
        fragtv = (TextView) rootView.findViewById(R.id.fragTextSherlock);
        fragtv.setText(String.valueOf(i));
        return rootView;
    }
}

【问题讨论】:

  • 你能在不崩溃的情况下打开和关闭抽屉吗? (不选择项目)
  • 关于关闭抽屉时更流畅的建议,添加一个保存抽屉位置的全局变量,这样你的 'DrawerItemClickListener' 将只有 'currentPosition = position' 然后 'mDrawerLayout.closeDrawer(mDrawerView) ;'然后添加 'selectItem(currentPosition);'关闭您的抽屉,同时删除 'mDrawerLayout.closeDrawer(mDrawerList);'从选择项目。我还建议添加一些代码来检查所选项目是否与之前的位置相同,以降低资源使用率
  • 如果代码中没有列表视图,我可以打开和关闭抽屉。如果 listview 在代码中,则应用程序在 listview.layoutchildren() (android 源代码的一部分)上崩溃。所以在我做任何事情之前它就崩溃了
  • 你能发布你的布局xml吗?
  • 和TestFragment代码?

标签: android android-listview actionbarsherlock android-resources


【解决方案1】:

问题是编译器没有告诉我我正在使用不属于兼容性且在 2.3.3 中不可用的项目

看看我必须删除的行:

drawer_list_item.xml

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceListItemSmall" <-Removed
    android:gravity="center_vertical"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:textColor="#fff"
    android:background="?android:attr/activatedBackgroundIndicator" <-Removed
    android:minHeight="?android:attr/listPreferredItemHeightSmall"/> <-Removed

【讨论】:

  • 有道理,我使用操作栏/导航抽屉组合,但由于我的应用需要 4.0.4+,所以我不必担心兼容性
  • 谢谢!在 2.3.7 上,删除 android:background="?android:attr/activatedBackgroundIndicator" 就足以使应用正常运行。
【解决方案2】:

为了支持低版本,不去掉下面三个参数,

  android:textAppearance="?android:attr/textAppearanceListItemSmall" 
  android:background="?android:attr/activatedBackgroundIndicator"
  android:minHeight="?android:attr/listPreferredItemHeightSmall"

您实际上可以将它们替换为等效的值/资源。

等效值可以从 https://github.com/android/platform_frameworks_base/blob/master/core/res/res/values/themes.xml

现在,

【讨论】:

    【解决方案3】:

    这通常是由于 res 文件夹中的可绘制资源不可用而发生的。有时您只是将可绘制对象从其他目录复制到项目的可绘制文件夹,但忘记从 IDE 的项目资源管理器添加此可绘制对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      • 2014-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多