在android项目中使用ActionBarSherlock时没有这样的字段错误

时间:2015-12-05 20:46:21

标签: android android-actionbar actionbarsherlock android-support-library android-fragmentactivity

我已将ActionBarSherlock库项目添加到我的项目中,但在运行时mFragments.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();
}

1 个答案:

答案 0 :(得分:1)

我遇到了这个问题,因为动作栏sherlock库正在用android-support-v4编译,但是在运行时这个库正在由v13执行,所以我从项目中删除了v13支持,我的问题解决了。