【问题标题】:Android - Anonymous inner type provoke error in edit modeAndroid - 匿名内部类型在编辑模式下引发错误
【发布时间】:2011-11-09 06:41:01
【问题描述】:

我需要帮助。我尝试扩展按钮类。一切都很好,但是如果我添加匿名类型,我会在设计模式下出错!代码如下:sn-p:

public class ExtDatePicker extends Button { 
private int mYear;
private int mMonth;
private int mDay;
private View view = new View(getContext());
private DatePickerDialog.OnDateSetListener mDateSetListener;

public ExtDatePicker(Context context, AttributeSet attrs) {
    super(context, attrs);
    Init();
}

private void Init(){
    // add a click listener to the button
    this.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            showDialog();
        }
    });

    // the callback received when the user "sets" the date in the dialog
    if(!view.isInEditMode()){

/********************** THIS CODE PROVOKE ERROR *****************************/
    mDateSetListener =
            new DatePickerDialog.OnDateSetListener() {
                public void onDateSet(DatePicker view, int year, 
                                      int monthOfYear, int dayOfMonth) {
                    mYear = year;
                    mMonth = monthOfYear;
                    mDay = dayOfMonth;
                    updateDisplay();
                }
             }; 

/****************************************************************************/      
    }       
    GetCurrentDate();
    updateDisplay();
}

// get the current date
private void GetCurrentDate(){
    Calendar c = Calendar.getInstance();
    mYear = c.get(Calendar.YEAR);
    mMonth = c.get(Calendar.MONTH);
    mDay = c.get(Calendar.DAY_OF_MONTH);
}

// updates the date in the TextView
private void updateDisplay() {
    String day = String.valueOf(mDay);
    String month = String.valueOf(mMonth+1);
    if(day.length()==1) day="0"+day;
    if(month.length()==1) month="0"+month;
    this.setText(
        new StringBuilder()
                // Month is 0 based so add 1
                .append(day).append(".")
                .append(month).append(".")                    
                .append(mYear));
}    

private void showDialog() {
    DatePickerDialog dialog = new DatePickerDialog(SharedClass.currentContext,
            mDateSetListener, mYear, mMonth, mDay);
    dialog.show();
}       

}

在运行时模式下效果很好!

错误:

java.lang.ClassNotFoundException: android.app.DatePickerDialog$OnDateSetListener 在 com.android.ide.eclipse.adt.internal.resources.manager.ProjectClassLoader.findClass(ProjectClassLoader.java:94) 在 java.lang.ClassLoader.loadClass(未知来源) 在 java.lang.ClassLoader.loadClass(未知来源) 在 java.lang.Class.getDeclaredConstructors0(本机方法) 在 java.lang.Class.privateGetDeclaredConstructors(未知来源) 在 java.lang.Class.getConstructor0(未知来源) 在 java.lang.Class.getConstructor(未知来源) 在 com.android.ide.eclipse.adt.internal.editors.layout.ProjectCallback.instantiateClass(ProjectCallback.java:262) 在 com.android.ide.eclipse.adt.internal.editors.layout.ProjectCallback.loadView(ProjectCallback.java:132) 在 android.view.BridgeInflater.loadCustomView(BridgeInflater.java:198) 在 android.view.BridgeInflater.createViewFromTag(BridgeInflater.java:126) 在 android.view.LayoutInflater.rInflate(LayoutInflater.java:618) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:407) 在 android.view.LayoutInflater.inflate(LayoutInflater.java:296) 在 com.android.layoutlib.bridge.Bridge.computeLayout(Bridge.java:397) 在 com.android.ide.common.rendering.LayoutLibrary.createLegacySession(LayoutLibrary.java:404) 在 com.android.ide.common.rendering.LayoutLibrary.createSession(LayoutLibrary.java:285) 在 com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.renderWithBridge(GraphicalEditorPart.java:1506) 在 com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.renderWithBridge(GraphicalEditorPart.java:1312) 在 com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.recomputeLayout(GraphicalEditorPart.java:1043) 在 com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.activated(GraphicalEditorPart.java:870) 在 com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditor.partActivated(LayoutEditor.java:378) 在 com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditor.partBroughtToTop(LayoutEditor.java:387) 在 org.eclipse.ui.internal.PartListenerList$2.run(PartListenerList.java:87) 在 org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) 在 org.eclipse.core.runtime.Platform.run(Platform.java:888) 在 org.eclipse.ui.internal.PartListenerList.fireEvent(PartListenerList.java:57) 在 org.eclipse.ui.internal.PartListenerList.firePartBroughtToTop(PartListenerList.java:85) 在 org.eclipse.ui.internal.PartService.firePartBroughtToTop(PartService.java:208) 在 org.eclipse.ui.internal.WorkbenchPagePartList.firePartBroughtToTop(WorkbenchPagePartList.java:76) 在 org.eclipse.ui.internal.WorkbenchPagePartList.fireActiveEditorChanged(WorkbenchPagePartList.java:52) 在 org.eclipse.ui.internal.PartList.setActiveEditor(PartList.java:162) 在 org.eclipse.ui.internal.WorkbenchPage.makeActiveEditor(WorkbenchPage.java:1281) 在 org.eclipse.ui.internal.WorkbenchPage.setActivePart(WorkbenchPage.java:3530) 在 org.eclipse.ui.internal.WorkbenchPage.requestActivation(WorkbenchPage.java:3077) 在 org.eclipse.ui.internal.PartPane.requestActivation(PartPane.java:279) 在 org.eclipse.ui.internal.EditorPane.requestActivation(EditorPane.java:98) 在 org.eclipse.ui.internal.PartPane.setFocus(PartPane.java:325) 在 org.eclipse.ui.internal.EditorPane.setFocus(EditorPane.java:127) 在 org.eclipse.ui.internal.PartStack.presentationSelectionChanged(PartStack.java:844) 在 org.eclipse.ui.internal.PartStack.access$1(PartStack.java:827) 在 org.eclipse.ui.internal.PartStack$1.selectPart(PartStack.java:137) 在 org.eclipse.ui.internal.presentations.util.TabbedStackPresentation$1.handleEvent(TabbedStackPresentation.java:133) 在 org.eclipse.ui.internal.presentations.util.AbstractTabFolder.fireEvent(AbstractTabFolder.java:269) 在 org.eclipse.ui.internal.presentations.util.AbstractTabFolder.fireEvent(AbstractTabFolder.java:278) 在 org.eclipse.ui.internal.presentations.defaultpresentation.DefaultTabFolder.access$1(DefaultTabFolder.java:1) 在 org.eclipse.ui.internal.presentations.defaultpresentation.DefaultTabFolder$2.handleEvent(DefaultTabFolder.java:88) 在 org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 在 org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053) 在 org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1077) 在 org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1062) 在 org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:774) 在 org.eclipse.swt.custom.CTabFolder.setSelection(CTabFolder.java:2743) 在 org.eclipse.swt.custom.CTabFolder.onMouse(CTabFolder.java:1429) 在 org.eclipse.swt.custom.CTabFolder$1.handleEvent(CTabFolder.java:257) 在 org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 在 org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053) 在 org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4066) 在 org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3657) 在 org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2640) 在 org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2604) 在 org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2438) 在 org.eclipse.ui.internal.Workbench$7.run(Workbench.java:671) 在 org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) 在 org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:664) 在 org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) 在 org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:115) 在 org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) 在 org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) 在 org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) 在 org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:369) 在 org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源) 在 java.lang.reflect.Method.invoke(未知来源) 在 org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:620) 在 org.eclipse.equinox.launcher.Main.basicRun(Main.java:575) 在 org.eclipse.equinox.launcher.Main.run(Main.java:1408)

我做错了什么? 请帮帮我。对不起我的英语!

【问题讨论】:

    标签: android


    【解决方案1】:

    这可能与你没有声明@Override 标签有关。

    尝试将您的代码更改为:

    mDateSetListener = DatePickerDialog.OnDateSetListener() {
    
                    @Override
                    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                        mYear = year;
                        mMonth = monthOfYear;
                        mDay = dayOfMonth;
                        updateDisplay();
    
                    }
                 }; 
    

    【讨论】:

    • 作为@Martyn 的后续行动,我发现有时项目设置从使用Java 1.6 更改为Java 1.5,其中覆盖不可用。我还没有弄清楚是什么原因造成的,但这可能是因为我有 4 个不同版本的 Eclipse 和一堆 Android SDK(我们使用 Android 工具)。如果这是覆盖问题,请检查您的项目设置。
    • 是的 - 我经常需要这样做,请先检查一下。
    【解决方案2】:

    试试:

    postDelayed(new Runnable() {
    public void run() {
                    dateSetListener = new OnDateSetListener() {
                        public void onDateSet(DatePicker view, int year, int monthOfYear,
                                int dayOfMonth) {
    
                        }
                    };
                }
            }, 0);
    

    【讨论】:

      猜你喜欢
      • 2013-02-04
      • 2012-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-29
      • 2011-07-06
      • 1970-01-01
      相关资源
      最近更新 更多