在android项目中使用ActionBarSherlock时没有此类字段错误

在android项目中使用ActionBarSherlock时没有此类字段错误,android,android-actionbar,actionbarsherlock,android-support-library,android-fragmentactivity,Android,Android Actionbar,Actionbarsherlock,Android Support Library,Android Fragmentactivity,我已将ActionBarSherlock库项目添加到我的项目中,但在运行时,mffragments.mAdded处没有此类字段错误 我的堆栈跟踪是: 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.su

我已将ActionBarSherlock库项目添加到我的项目中,但在运行时,
mffragments.mAdded
处没有此类字段错误

我的堆栈跟踪是:

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)
Watson类看起来像这样:

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();
}
公共抽象类Watson扩展了FragmentActivity实现OnCreatePanelMenuListener、OnPreparePanelListener、OnMenuItemSelectedListener{
私有静态最终字符串TAG=“Watson”;
/**菜单创建回调的片段接口*/
CreateOptionsMenuListener的公共接口{
public void onCreateOptions菜单(菜单菜单,菜单充气机);
}
/**菜单准备回调的片段接口*/
PrepareOptionsNuListener上的公共接口{
在PrepareOptions功能表(菜单)上公共作废;
}
/**菜单项选择回调的片段接口*/
选项ItemSelectedListener的公共接口{
公共布尔值onOptionsItemSelected(菜单项);
}
私人ArrayList McCreatedMenus;
///////////////////////////////////////////////////////////////////////////
//Sherlock菜单处理
///////////////////////////////////////////////////////////////////////////
@凌驾
公共布尔onCreatePanel菜单(int-featureId,菜单菜单){
if(ActionBarSherlock.DEBUG)Log.d(标记“[onCreatePanelMenu]featureId:”+featureId+”,menu:“+menu”);
如果(featureId==窗口功能选项面板){
布尔结果=onCreateOptions菜单(菜单);
if(ActionBarSherlock.DEBUG)Log.d(标记“[onCreatePanelMenu]活动创建结果“+result”);
MenuInflater充气器=getSupportMenuInflater();
布尔显示=假;
ArrayList newMenus=null;
if(mffragments.mAdded!=null){
对于(int i=0;i
我面临这个问题,因为action bar sherlock库是用android-support-v4编译的,但在运行时,这个库是由v13执行的,所以我从项目中删除了v13支持,我的问题得到了解决。

action bar sherlock不推荐使用,为什么不直接使用支持库呢?