4

我是一個使用ActionBarSherlock構建的應用程序,它的ShareActionProvider用於生成其他應用程序的Intent。我根據庫的github頁面中的示例代碼創建了該項目;起初,我的工作完美無瑕。然而,一天之後,它就停止了工作。如果我刪除關於菜餚通貨膨脹活動正常加載代碼,否則它與下面的異常崩潰:ActionBarSherlock&ShareActionProvider cause InflateException

05-31 22:28:41.200: E/AndroidRuntime(15874): FATAL EXCEPTION: main 
05-31 22:28:41.200: E/AndroidRuntime(15874): android.view.InflateException: Binary XML file line #26: Error inflating class <unknown> 
05-31 22:28:41.200: E/AndroidRuntime(15874): at android.view.LayoutInflater.createView(LayoutInflater.java:613) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at android.view.LayoutInflater.onCreateView(LayoutInflater.java:660) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:685) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at android.view.LayoutInflater.rInflate(LayoutInflater.java:746) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at com.actionbarsherlock.widget.ActivityChooserView.<init>(ActivityChooserView.java:229) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at com.actionbarsherlock.widget.ActivityChooserView.<init>(ActivityChooserView.java:202) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at com.actionbarsherlock.widget.ActivityChooserView.<init>(ActivityChooserView.java:192) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at com.actionbarsherlock.widget.ShareActionProvider.onCreateActionView(ShareActionProvider.java:164) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at com.actionbarsherlock.internal.view.ActionProviderWrapper.onCreateActionView(ActionProviderWrapper.java:23) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at android.view.ActionProvider.onCreateActionView(ActionProvider.java:98) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at com.android.internal.view.menu.MenuItemImpl.getActionView(MenuItemImpl.java:580) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at com.android.internal.view.menu.ActionMenuPresenter.getItemView(ActionMenuPresenter.java:235) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at com.android.internal.view.menu.ActionMenuPresenter.flagActionItems(ActionMenuPresenter.java:513) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at com.android.internal.view.menu.MenuBuilder.flagActionItems(MenuBuilder.java:1048) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at com.android.internal.view.menu.BaseMenuPresenter.updateMenuView(BaseMenuPresenter.java:91) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at com.android.internal.view.menu.ActionMenuPresenter.updateMenuView(ActionMenuPresenter.java:268) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at com.android.internal.view.menu.MenuBuilder.dispatchPresenterUpdate(MenuBuilder.java:244) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at com.android.internal.view.menu.MenuBuilder.onItemsChanged(MenuBuilder.java:946) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at com.android.internal.view.menu.MenuBuilder.startDispatchingItemsChanged(MenuBuilder.java:969) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:488) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at com.android.internal.policy.impl.PhoneWindow.invalidatePanelMenu(PhoneWindow.java:819) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:3148) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at android.os.Handler.handleCallback(Handler.java:615) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at android.os.Handler.dispatchMessage(Handler.java:92) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at android.os.Looper.loop(Looper.java:137) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at android.app.ActivityThread.main(ActivityThread.java:4898) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at java.lang.reflect.Method.invokeNative(Native Method) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at java.lang.reflect.Method.invoke(Method.java:511) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at dalvik.system.NativeStart.main(Native Method) 
05-31 22:28:41.200: E/AndroidRuntime(15874): Caused by: java.lang.reflect.InvocationTargetException 
05-31 22:28:41.200: E/AndroidRuntime(15874): at java.lang.reflect.Constructor.constructNative(Native Method) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at java.lang.reflect.Constructor.newInstance(Constructor.java:417) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at android.view.LayoutInflater.createView(LayoutInflater.java:587) 
05-31 22:28:41.200: E/AndroidRuntime(15874): ... 33 more 
05-31 22:28:41.200: E/AndroidRuntime(15874): Caused by: android.content.res.Resources$NotFoundException: Resource is not a Drawable (color or path): TypedValue{t=0x2/d=0x7f01000f a=-1} 
05-31 22:28:41.200: E/AndroidRuntime(15874): at android.content.res.Resources.loadDrawable(Resources.java:1925) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at android.content.res.TypedArray.getDrawable(TypedArray.java:601) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at android.view.View.<init>(View.java:3436) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at android.view.ViewGroup.<init>(ViewGroup.java:432) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at android.widget.FrameLayout.<init>(FrameLayout.java:101) 
05-31 22:28:41.200: E/AndroidRuntime(15874): at android.widget.FrameLayout.<init>(FrameLayout.java:97) 
05-31 22:28:41.200: E/AndroidRuntime(15874): ... 36 more 

正如你所看到的,沒有任何指向我的代碼;我跟蹤這個問題到了該方法的第一行:

public class NewsDetailActivity extends SherlockFragmentActivity{ 
    . 
    . 
    . 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getSupportMenuInflater().inflate(R.menu.news_detail, menu); 
     //mShareActionProvider = (ShareActionProvider) menu.findItem(R.id.share).getActionProvider(); 
     //mShareActionProvider.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME); 
     return super.onCreateOptionsMenu(menu); 
    } 

如果該行被刪除,該活動的工作就好了。菜單佈局如下所示:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item 
    android:id="@+id/share" 
    android:title="@string/share" 
    android:showAsAction="ifRoom" 
    android:actionProviderClass="com.actionbarsherlock.widget.ShareActionProvider"/> 
</menu> 

我一直無法得到解決的問題,一直沒能找到有人用類似的問題。不過,我確實在圖書館的wiki中讀過主題可能是問題,以下是我的應用程序和操作欄的主題,我已將其更改爲Theme.Sherlock.Light和其他許多人無濟於事。

<resources xmlns:android="http://schemas.android.com/apk/res/android"> 
<style name="AppBaseTheme" parent="Theme.Sherlock"> 
    <item name="actionBarStyle">@style/ActionBar</item> 
    <item name="android:actionBarStyle">@style/ActionBar</item> 
</style> 

<style name="ActionBar" parent="@style/Widget.Sherlock.ActionBar"> 
    <item name="android:textColor">#ffffff</item> 
    <item name="android:textStyle">bold</item>> 
    <item name="android:background">@drawable/background_actionbar</item> 
    <item name="android:backgroundStacked">@drawable/background_actionbar</item> 
    <item name="android:backgroundSplit">@drawable/background_actionbar</item> 
</style> 
</resources> 

我正在使用庫的最新版本。我希望有人能幫助我!謝謝!

編輯:我一直沒能解決問題,但我跟蹤異常下降到這個XML在ActionBarSherlock(佈局/ abs_activity_chooser_view.xml):

<com.actionbarsherlock.internal.widget.IcsLinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/abs__activity_chooser_view_content" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    style="?attr/activityChooserViewStyle"> 

    <FrameLayout 
     android:id="@+id/abs__expand_activities_button" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:layout_gravity="center" 
     android:focusable="true" 
     android:addStatesFromChildren="true" 
     android:background="?attr/actionBarItemBackground"> 

     <ImageView android:id="@+id/abs__image" 
      android:layout_width="56dip" 
      android:layout_height="36dip" 
      android:layout_gravity="center" 
      android:paddingTop="2dip" 
      android:paddingBottom="2dip" 
      android:paddingLeft="12dip" 
      android:paddingRight="12dip" 
      android:scaleType="fitCenter" 
      android:adjustViewBounds="true" /> 

    </FrameLayout> 

    <FrameLayout 
     android:id="@+id/abs__default_activity_button" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:layout_gravity="center" 
     android:focusable="true" 
     android:addStatesFromChildren="true" 
     android:background="?attr/actionBarItemBackground"> 

     <ImageView android:id="@+id/abs__image" 
      android:layout_width="56dip" 
      android:layout_height="36dip" 
      android:layout_gravity="center" 
      android:paddingTop="2dip" 
      android:paddingBottom="2dip" 
      android:paddingLeft="12dip" 
      android:paddingRight="12dip" 
      android:scaleType="fitCenter" 
      android:adjustViewBounds="true" /> 

    </FrameLayout> 

</com.actionbarsherlock.internal.widget.IcsLinearLayout> 

這似乎是異常所致通過FrameLayout。

編輯2:好吧,我找到了一種方法來阻止應用程序崩潰。我刪除了自定義主題,從我的應用程序,並從動作條的風格,使應用程序的主題,如:

<application android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/Theme.Sherlock" > 

這種運作良好,但是,我已經失去了自定義動作條的可能性。

+1

您的代碼看起來正確。我相信你說它以前完美無瑕。你是否嘗試清理並重建整個工作空間? – Ethan

+1

是的,事實上我刪除了庫並從源代碼重新下載。但問題重複... – CristianGuerrero

+0

我有同樣的問題。我不得不使用android:theme =「@ style/Theme.Sherlock.Light」 –

回答

1

如果在onCreate中設置主題,則可以使用自定義樣式而不會出現錯誤或崩潰。

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setTheme(R.style.YourCustomTheme); 
...} 

不覺得它得到的問題的根源,但至少給你一些選擇。

0

我猜這是一個主題問題。嘗試改變:

<style name="ActionBar" parent="@style/Widget.Sherlock.ActionBar"> 

<style name="ActionBar" parent="Widget.Sherlock.ActionBar.Solid"> 
2

您的活動到Android的選擇風格:主題= 「@風格/ Theme.Sherlock」 在AndroidManifest.xml

像這樣的事情

<activity 
     android:name=".MainActivity" 
     android:theme="@style/Theme.Sherlock"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
+0

這就是我最初的做法,但似乎Sherlock在樣式上遇到了一些麻煩。無論如何,我切換到ActionBarCompat。 – CristianGuerrero

+0

看來actionbarsherlock在主題標題中需要單詞「Sherlock」(如Theme.Sherlock.MyCustomTheme)。 AppCompat庫在主題標題中需要單詞「Compat」(如Theme.Compat.MyCustomTheme)。當我將這些詞添加到我的主題時,它總是有效。 –

1

我有同樣的問題,但我從代碼創建ShareActionProvider。ShareActionProvider's構造函數的第一個參數使用getSupportActionBar().getThemedContext()解決了這個問題。

相關問題