2011-02-27 82 views
11

我想创建我的第一个自定义视图子类GraphView并将其添加到我的布局XML文件。添加我的自定义视图到XML布局抛出异常

我发现this SO question,并试图将其应用到我的项目,但事情似乎是错误的,因为Eclipse IDE的告诉我:

de.muza3000.graph.GraphView failed to instantiate. 

,并抛出一个异常:

java.lang.NoSuchMethodException: de.muza3000.graph.GraphView.<init>(android.content.Context, android.util.AttributeSet) 
at java.lang.Class.getConstructor0(Unknown Source) 
at java.lang.Class.getConstructor(Unknown Source) 
at com.android.ide.eclipse.adt.internal.editors.layout.ProjectCallback.instantiateClass(Unknown Source) 
at com.android.ide.eclipse.adt.internal.editors.layout.ProjectCallback.loadView(Unknown Source) 
at android.view.BridgeInflater.loadCustomView(BridgeInflater.java:198) 
at android.view.BridgeInflater.createViewFromTag(BridgeInflater.java:126) 
at android.view.LayoutInflater.rInflate(LayoutInflater.java:618) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:407) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:296) 
at com.android.layoutlib.bridge.Bridge.computeLayout(Bridge.java:396) 
at com.android.ide.common.rendering.LayoutLibrary.createLegacySession(LayoutLibrary.java:382) 
at com.android.ide.common.rendering.LayoutLibrary.createSession(LayoutLibrary.java:276) 
at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.renderWithBridge(Unknown Source) 
at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.renderWithBridge(Unknown Source) 
at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.recomputeLayout(Unknown Source) 
at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.activated(Unknown Source) 
at com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditor.pageChange(Unknown Source) 
at org.eclipse.ui.part.MultiPageEditorPart$2.widgetSelected(MultiPageEditorPart.java:290) 
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:234) 
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053) 
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1077) 
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1062) 
at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:774) 
at org.eclipse.swt.custom.CTabFolder.setSelection(CTabFolder.java:2743) 
at org.eclipse.swt.custom.CTabFolder.onMouse(CTabFolder.java:1429) 
at org.eclipse.swt.custom.CTabFolder$1.handleEvent(CTabFolder.java:257) 
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053) 
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4066) 
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3657) 
at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2640) 
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2604) 
at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2438) 
at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:671) 
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) 
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:664) 
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) 
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:115) 
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) 
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) 
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) 
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:369) 
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:619) 
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:574) 
at org.eclipse.equinox.launcher.Main.run(Main.java:1407) 

这里是我的布局:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/hello"/> 
    <de.muza3000.graph.GraphView 
     android:layout_width="fill_parent"/> 
</LinearLayout> 

而我的代码:

package de.muza3000.graph; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.View; 

public class GraphView extends View { 


    GraphView(Context context, AttributeSet attrs, int defStyle) 
    { 
     super(context, attrs, defStyle); 
    } 


    GraphView(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
    } 

    GraphView(Context context) 
    { 
     super(context); 
    } 

} 

回答

21

将构造函数的访问修饰符更改为public。

+1

哇,它的工作!非常感谢! – muza3000 2011-02-27 12:58:02

+0

非常感谢。 – Lunchbox 2014-11-09 21:07:24

相关问题