问题
I looked at this question however, it did not help solve my problem:
- Resources$NotFoundException: Resource is not a Drawable
I'm using ActionBarSherlock (version 4.4) within my app for compatibility in older versions. My app runs perfect on 4.1.2 but it crashes on 2.3.3. The app runs all the way up to the point of mDrawerLayout.closeDrawer(mDrawerList);
then it crashes after that. I cannot figure out what is causing it to crash on older versions. I have a feeling that it is because it is trying to use something that doesn't exist in that version however, I cannot pinpoint what it is using. Does anyone see any code that seems wrong?
The error in the logcat:
Caused by: android.content.res.Resources$NotFoundException: Resource is not a Drawable (color or path): TypedValue{t=0x2/d=0x10102fd a=-1}
Logcat Error
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
styles.xml from values folder:
<resources>
<style name="AppBaseTheme" parent="Theme.Sherlock.Light.DarkActionBar">
</style>
<style name="AppTheme" parent="AppBaseTheme">
</style>
</resources>
Java file
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);
}
EDIT/UPDATE
I went through and commented out all the parts that involved the listview mDrawerList
and the application fired right up with a working actionbar just no listview in the drawer.
Layout 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;
}
}
回答1:
The problem was that the compiler did not tell me that I was using items that were not part of the compatiabiliy and were not avaliable in 2.3.3
Look at the lines I had to remove:
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
回答2:
To support lower versions, instead of removing the following three parameters,
android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:background="?android:attr/activatedBackgroundIndicator"
android:minHeight="?android:attr/listPreferredItemHeightSmall"
You can actually replace them with equivalent values/resources.
The equivalent values can be obtained from https://github.com/android/platform_frameworks_base/blob/master/core/res/res/values/themes.xml
Now,
a)
android:textAppearance="@android:style/TextAppearance.Medium"
b)
Download a selector from https://github.com/habzy/Test0011_DialerPad/blob/master/res/drawable/list_item_activated_background.xml
In the above project browse the resources in hdpi,mdpi etc and get files named list_activated_holo.9.png
Finally
android:background="@drawable/activated_background_holo_dark"
c) From the equivalent values obtained , we know that listPreferredItemHeightSmall is 48dip
android:minHeight="48dip"
回答3:
This is often occur due to unavailability of a drawable resource in res folder. Some times you just copy the drawable from other directory to you project's drawable folder, but forget to add this drawable from IDE's project explorer.
来源:https://stackoverflow.com/questions/18278386/resource-cannot-be-found-no-identifier-for-missing-item