0

Я добавил проект библиотеки ActionBarSherlock в мой проект, но у меня нет такой ошибки поля в mFragments.mAdded во время выполнения.Нет такой ошибки поля при использовании ActionBarSherlock в проекте android

Моего стек следа:

12-06 00:40:00.480: E/AndroidRuntime(27990): java.lang.NoSuchFieldError: android.support.v4.app.Watson.mFragments 
12-06 00:40:00.480: E/AndroidRuntime(27990): at android.support.v4.app.Watson.onCreatePanelMenu(Watson.java:50) 
12-06 00:40:00.480: E/AndroidRuntime(27990): at com.actionbarsherlock.ActionBarSherlock.callbackCreateOptionsMenu(ActionBarSherlock.java:560) 
12-06 00:40:00.480: E/AndroidRuntime(27990): at com.actionbarsherlock.internal.ActionBarSherlockNative.dispatchCreateOptionsMenu(ActionBarSherlockNative.java:64) 
12-06 00:40:00.480: E/AndroidRuntime(27990): at com.actionbarsherlock.app.SherlockFragmentActivity.onCreatePanelMenu(SherlockFragmentActivity.java:164) 
12-06 00:40:00.480: E/AndroidRuntime(27990): at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:512) 
12-06 00:40:00.480: E/AndroidRuntime(27990): at com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:881) 
12-06 00:40:00.480: E/AndroidRuntime(27990): at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:297) 
12-06 00:40:00.480: E/AndroidRuntime(27990): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:812) 
12-06 00:40:00.480: E/AndroidRuntime(27990): at android.view.Choreographer.doCallbacks(Choreographer.java:612) 
12-06 00:40:00.480: E/AndroidRuntime(27990): at android.view.Choreographer.doFrame(Choreographer.java:581) 
12-06 00:40:00.480: E/AndroidRuntime(27990): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:798) 
12-06 00:40:00.480: E/AndroidRuntime(27990): at android.os.Handler.handleCallback(Handler.java:733) 
12-06 00:40:00.480: E/AndroidRuntime(27990): at android.os.Handler.dispatchMessage(Handler.java:95) 
12-06 00:40:00.480: E/AndroidRuntime(27990): at android.os.Looper.loop(Looper.java:146) 
12-06 00:40:00.480: E/AndroidRuntime(27990): at android.app.ActivityThread.main(ActivityThread.java:5602) 
12-06 00:40:00.480: E/AndroidRuntime(27990): at java.lang.reflect.Method.invokeNative(Native Method) 
12-06 00:40:00.480: E/AndroidRuntime(27990): at java.lang.reflect.Method.invoke(Method.java:515) 
12-06 00:40:00.480: E/AndroidRuntime(27990): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) 
12-06 00:40:00.480: E/AndroidRuntime(27990): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) 
12-06 00:40:00.480: E/AndroidRuntime(27990): at dalvik.system.NativeStart.main(Native Method) 

Уотсон класс выглядит следующим образом:

public abstract class Watson extends FragmentActivity implements OnCreatePanelMenuListener, OnPreparePanelListener, OnMenuItemSelectedListener { 
private static final String TAG = "Watson"; 
/** Fragment interface for menu creation callback. */ 
public interface OnCreateOptionsMenuListener { 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater); 
} 
/** Fragment interface for menu preparation callback. */ 
public interface OnPrepareOptionsMenuListener { 
    public void onPrepareOptionsMenu(Menu menu); 
} 
/** Fragment interface for menu item selection callback. */ 
public interface OnOptionsItemSelectedListener { 
    public boolean onOptionsItemSelected(MenuItem item); 
} 

private ArrayList<Fragment> mCreatedMenus; 
/////////////////////////////////////////////////////////////////////////// 
// Sherlock menu handling 
/////////////////////////////////////////////////////////////////////////// 

@Override 
public boolean onCreatePanelMenu(int featureId, Menu menu) { 
    if (ActionBarSherlock.DEBUG) Log.d(TAG, "[onCreatePanelMenu] featureId: " + featureId + ", menu: " + menu); 

    if (featureId == Window.FEATURE_OPTIONS_PANEL) { 
     boolean result = onCreateOptionsMenu(menu); 
     if (ActionBarSherlock.DEBUG) Log.d(TAG, "[onCreatePanelMenu] activity create result: " + result); 

     MenuInflater inflater = getSupportMenuInflater(); 
     boolean show = false; 
     ArrayList<Fragment> newMenus = null; 
     if (mFragments.mAdded != null) { 
      for (int i = 0; i < mFragments.mAdded.size(); i++) { 
       Fragment f = mFragments.mAdded.get(i); 
       if (f != null && !f.mHidden && f.mHasMenu && f.mMenuVisible && f instanceof OnCreateOptionsMenuListener) { 
        show = true; 
        ((OnCreateOptionsMenuListener)f).onCreateOptionsMenu(menu, inflater); 
        if (newMenus == null) { 
         newMenus = new ArrayList<Fragment>(); 
        } 
        newMenus.add(f); 
       } 
      } 
     } 

     if (mCreatedMenus != null) { 
      for (int i = 0; i < mCreatedMenus.size(); i++) { 
       Fragment f = mCreatedMenus.get(i); 
       if (newMenus == null || !newMenus.contains(f)) { 
        f.onDestroyOptionsMenu(); 
       } 
      } 
     } 

     mCreatedMenus = newMenus; 

     if (ActionBarSherlock.DEBUG) Log.d(TAG, "[onCreatePanelMenu] fragments create result: " + show); 
     result |= show; 

     if (ActionBarSherlock.DEBUG) Log.d(TAG, "[onCreatePanelMenu] returning " + result); 
     return result; 
    } 
    return false; 
} 

@Override 
public boolean onPreparePanel(int featureId, View view, Menu menu) { 
    if (ActionBarSherlock.DEBUG) Log.d(TAG, "[onPreparePanel] featureId: " + featureId + ", view: " + view + " menu: " + menu); 

    if (featureId == Window.FEATURE_OPTIONS_PANEL) { 
     boolean result = onPrepareOptionsMenu(menu); 
     if (ActionBarSherlock.DEBUG) Log.d(TAG, "[onPreparePanel] activity prepare result: " + result); 

     boolean show = false; 
     if (mFragments.mAdded != null) { 
      for (int i = 0; i < mFragments.mAdded.size(); i++) { 
       Fragment f = mFragments.mAdded.get(i); 
       if (f != null && !f.mHidden && f.mHasMenu && f.mMenuVisible && f instanceof OnPrepareOptionsMenuListener) { 
        show = true; 
        ((OnPrepareOptionsMenuListener)f).onPrepareOptionsMenu(menu); 
       } 
      } 
     } 

     if (ActionBarSherlock.DEBUG) Log.d(TAG, "[onPreparePanel] fragments prepare result: " + show); 
     result |= show; 

     result &= menu.hasVisibleItems(); 
     if (ActionBarSherlock.DEBUG) Log.d(TAG, "[onPreparePanel] returning " + result); 
     return result; 
    } 
    return false; 
} 

@Override 
public boolean onMenuItemSelected(int featureId, MenuItem item) { 
    if (ActionBarSherlock.DEBUG) Log.d(TAG, "[onMenuItemSelected] featureId: " + featureId + ", item: " + item); 

    if (featureId == Window.FEATURE_OPTIONS_PANEL) { 
     if (onOptionsItemSelected(item)) { 
      return true; 
     } 

     if (mFragments.mAdded != null) { 
      for (int i = 0; i < mFragments.mAdded.size(); i++) { 
       Fragment f = mFragments.mAdded.get(i); 
       if (f != null && !f.mHidden && f.mHasMenu && f.mMenuVisible && f instanceof OnOptionsItemSelectedListener) { 
        if (((OnOptionsItemSelectedListener)f).onOptionsItemSelected(item)) { 
         return true; 
        } 
       } 
      } 
     } 
    } 
    return false; 
} 

public abstract boolean onCreateOptionsMenu(Menu menu); 

public abstract boolean onPrepareOptionsMenu(Menu menu); 

public abstract boolean onOptionsItemSelected(MenuItem item); 

public abstract MenuInflater getSupportMenuInflater(); 
} 
+4

ActionBarSherlock устарел, почему вы просто не используете библиотеку поддержки? – Androiderson

ответ

1

Я столкнулся с этой проблемой, так как библиотека шерлок панели действий была быть собрана с андроидом-поддержкой-v4, но во время выполнения эта библиотека выполнялась v13, поэтому я удалил поддержку v13 из проекта, и моя проблема была решена.

Смежные вопросы