Android 中的按钮(任何视图 Class)添加了方法

Added methods to the Button (any view Class) in Android

我已经设置了 android class 以编程方式设置在 XML 中创建的系列按钮的文本。在此 class 中,我还想为按钮的每个实例创建一个标识符 (numberid),以便稍后在 onclick 方法中使用,以便能够区分每个按钮并且两者也有区别。

我使用了下面的代码并设置了 XML 中的按钮以使用我的 class 而不是官方按钮 class

public final class numpadButton extends Button {
public int buttonNumber;

public numpadButton(Context context) {
    super(context);
     }


public void setButtonNumber(int buttonNumber) {
    this.buttonNumber = buttonNumber;

}

public int getButtonNumber() {
    return buttonNumber;
}

}

但是扩展按钮 class 并添加所需的方法最终会导致错误:android.view.InflateException:二进制 XML 文件行 #13:膨胀 class 时出错。 ..

我知道可能还有其他解决方案,我愿意接受有关实现我目标的最佳方法的建议,但是我也有兴趣弄清楚如何使我上面谈到的方法也起作用。

编辑:XML

<macintyre.math.com.mathpractice.numpadButton style="@style/button" />

风格,虽然我不明白为什么这会导致问题。

 <style name="button">
        <item name="android:layout_width"> fill_parent</item>
        <item name="android:layout_height">fill_parent</item>
        <item name="android:layout_weight"> 1</item>
    </style>



06-02 02:42:32.625    2428-2428/macintyre.math.com.mathpractice W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0xa4d56b20) 06-02 02:42:32.629    2428-2428/macintyre.math.com.mathpractice E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: macintyre.math.com.mathpractice, PID: 2428
    android.view.InflateException: Binary XML file line #13: Error inflating class macintyre.math.com.mathpractice.numpadButton
            at android.view.LayoutInflater.createView(LayoutInflater.java:603)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
            at android.view.LayoutInflater.parseInclude(LayoutInflater.java:839)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:745)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
            at macintyre.math.com.mathpractice.numberpad.onCreateView(numberpad.java:28)
            at android.app.Fragment.performCreateView(Fragment.java:1700)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:866)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1040)
            at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1142)
            at android.app.Activity.onCreateView(Activity.java:4786)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:689)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
            at macintyre.math.com.mathpractice.AdditionFragment.onCreateView(AdditionFragment.java:19)
            at android.app.Fragment.performCreateView(Fragment.java:1700)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
            at android.app.BackStackRecord.run(BackStackRecord.java:684)
            at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
            at android.app.FragmentManagerImpl.run(FragmentManager.java:443)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5001)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet]
            at java.lang.Class.getConstructorOrMethod(Class.java:472)
            at java.lang.Class.getConstructor(Class.java:446)
            at android.view.LayoutInflater.createView(LayoutInflater.java:568)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
            at android.view.LayoutInflater.parseInclude(LayoutInflater.java:839)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:745)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
            at macintyre.math.com.mathpractice.numberpad.onCreateView(numberpad.java:28)
            at android.app.Fragment.performCreateView(Fragment.java:1700)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:866)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1040)
            at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1142)
            at android.app.Activity.onCreateView(Activity.java:4786)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:689)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
            at macintyre.math.com.mathpractice.AdditionFragment.onCreateView(AdditionFragment.java:19)
            at android.app.Fragment.performCreateView(Fragment.java:1700)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
            at android.app.BackStackRecord.run(BackStackRecord.java:684)
            at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
            at android.app.FragmentManagerImpl.run(FragmentManager.java:443)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5001)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)

从 XML:

扩展自定义视图时必须实现此构造函数
public View(Context context, AttributeSet attrs)

来自官方文档:

Constructor that is called when inflating a view from XML.

http://developer.android.com/reference/android/view/View.html#View(android.content.Context, android.util.AttributeSet)

从布局文件中扩充的元素将使用第二个构造函数签名:

public numpadButton(Context context, AttributeSet attrs)

尽管您应该实现所有构造函数签名:

public numpadButton(Context context, AttributeSet attrs, int defStyleAttr)
public numpadButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)