我已将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();
}
答案 0 :(得分:1)
我遇到了这个问题,因为动作栏sherlock库正在用android-support-v4编译,但是在运行时这个库正在由v13执行,所以我从项目中删除了v13支持,我的问题解决了。