android – 实现扩展/自定义View为构造函数抛出NoSuchMethod

前端之家收集整理的这篇文章主要介绍了android – 实现扩展/自定义View为构造函数抛出NoSuchMethod前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个自定义的TextView,它实现了三个View构造函数(nb,这是我在 Android应用程序中的第一次尝试):
  1. public class DynamicGeometryTextView extends TextView {
  2.  
  3. public DynamicGeometryTextView (Context con) { super(con); }
  4.  
  5. public DynamicGeometryTextView (Context con,AttributeSet attrs) {
  6. super(con,attrs);
  7. }
  8.  
  9. public DynamicGeometryTextView (Context con,AttributeSet attrs,int style) {
  10. super(con,attrs,style);
  11. }

这是一个非静态内部类,因为它需要从外部类访问实例数据.它出现在.xml布局中:

  1. <view class="cogdis.chalkboard.DisplayText$DynamicGeometryTextView"
  2. android:id="@+id/chalkboard"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content" />

一切都编译和安装很好,但在运行时:

  1. Caused by: android.view.InflateException: Binary XML file line #7: Error inflating class cogdis.chalkboard.DisplayText$DynamicGeometryTextView
  2. at android.view.LayoutInflater.createView(LayoutInflater.java:596)
  3. at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)
  4. at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
  5. at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
  6. at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
  7. at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
  8. at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:256)
  9. at android.app.Activity.setContentView(Activity.java:1867)
  10. at cogdis.chalkboard.DisplayText.onCreate(DisplayText.java:26)
  11. at android.app.Activity.performCreate(Activity.java:5008)
  12. at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
  13. at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
  14. ... 11 more
  15. Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context,interface android.util.AttributeSet]
  16. at java.lang.Class.getConstructorOrMethod(Class.java:460)
  17. at java.lang.Class.getConstructor(Class.java:431)
  18. at android.view.LayoutInflater.createView(LayoutInflater.java:561)
  19. ... 22 more

在我看来,这意味着它无法找到构造函数的(Context,AttributeSet)版本……但它存在.我看了一些其他的SO帖子,比如Android Custom View Constructor,这一切都指向了相同的结论(我的眼睛),并反复阅读自定义组件的API指南,但我已经被这个问题困扰了一个多小时.

有人有主意吗?有没有办法进一步调试?

对于像我这样的新手来说,如果你的自定义视图在XML布局中被引用,那么非静态内部类是不行的,但是如果你以编程方式创建它,它可以工作,例如:

  1. LayoutInflater lif = getLayoutInflater();
  2. ViewGroup layout = (ViewGroup)lif.inflate(R.layout.board,null);
  3.  
  4. tv = new DynamicGeometryTextView(this);
  5.  
  6. layout.addView((View)tv);

在这种情况下,您只需要匹配实际使用的构造函数.可以通过从View继承的setLayoutParams()在构造函数中设置布局参数(WRAP_CONTENT等).

解决方法

无法实例化非静态内部类 without reference to an instance of the outer class.
  1. OuterClass.InnerClass innerObject = outerObject.new InnerClass();

所以这可能是布局填充无法给你的课堂膨胀的原因.删除对外部类成员的引用后,使您的类保持静态.

猜你在找的Android相关文章