我有一个自定义的TextView,它实现了三个View构造函数(nb,这是我在Android应用程序中的第一次尝试):
public class DynamicGeometryTextView extends TextView {
public DynamicGeometryTextView (Context con) { super(con); }
public DynamicGeometryTextView (Context con, AttributeSet attrs) {
super(con, attrs);
}
public DynamicGeometryTextView (Context con, AttributeSet attrs, int style) {
super(con, attrs, style);
}
Run Code Online (Sandbox Code Playgroud)
这是一个非静态内部类,因为它需要从外部类访问实例数据.它出现在.xml布局中:
<view class="cogdis.chalkboard.DisplayText$DynamicGeometryTextView"
android:id="@+id/chalkboard"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
Run Code Online (Sandbox Code Playgroud)
一切都编译和安装很好,但在运行时:
Caused by: android.view.InflateException: Binary XML file line #7: Error inflating class cogdis.chalkboard.DisplayText$DynamicGeometryTextView
at android.view.LayoutInflater.createView(LayoutInflater.java:596)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:256)
at android.app.Activity.setContentView(Activity.java:1867)
at cogdis.chalkboard.DisplayText.onCreate(DisplayText.java:26)
at android.app.Activity.performCreate(Activity.java:5008)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
... 11 more
Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet]
at java.lang.Class.getConstructorOrMethod(Class.java:460)
at java.lang.Class.getConstructor(Class.java:431)
at android.view.LayoutInflater.createView(LayoutInflater.java:561)
... 22 more
Run Code Online (Sandbox Code Playgroud)
在我看来,这意味着它无法找到构造函数的(Context,AttributeSet)版本......但它存在.我已经看过其他一些SO帖子,比如Android自定义视图构造函数,这一切都指向了相同的结论(在我看来)并反复阅读自定义组件的API指南,但我已经被这个问题困扰了一小时.
有人有主意吗?有没有办法进一步调试?
为后代,即任何新的这个和我一样,非静态内部类是一个没有去,如果您的自定义视图是一个XML布局引用,但如果编程创建它,它可以工作,例如:
LayoutInflater lif = getLayoutInflater();
ViewGroup layout = (ViewGroup)lif.inflate(R.layout.board, null);
tv = new DynamicGeometryTextView(this);
layout.addView((View)tv);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您只需要匹配实际使用的构造函数.布局参数(WRAP_CONTENT等)可以在构造函数中设置,通过setLayoutParams()该构造函数继承自View.
没有引用外部类的实例,就无法实例化非静态内部类.
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
Run Code Online (Sandbox Code Playgroud)
因此,这可能是布局填充无法使您的课程膨胀的原因.删除对外部类成员的引用后,使您的类保持静态.
更改:
public class DynamicGeometryTextView extends TextView {
Run Code Online (Sandbox Code Playgroud)
至:
public static class DynamicGeometryTextView extends TextView {
Run Code Online (Sandbox Code Playgroud)
为了正确引用它,它必须是一个static内部类
| 归档时间: |
|
| 查看次数: |
4193 次 |
| 最近记录: |