在android项目中使用ActionBarSherlock时没有此类字段错误
我已将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
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不推荐使用,为什么不直接使用支持库呢?