如何扩展微调器以实现新功能?

Fer*_*rCa 10 android android-spinner

我正在尝试Spinner在我的代码中扩展Android类来实现一个新函数,但由于某种原因,这不起作用.

这是扩展类:

import android.content.Context;
import android.widget.AdapterView;
import android.widget.Spinner;

public class CustomSpinner extends Spinner {

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

    public void setSelectionByItemId(AdapterView<?> parent, long id){
        for (int i = 0; i < parent.getCount(); i++) {              
            long itemIdAtPosition = parent.getItemIdAtPosition(i);
            if (itemIdAtPosition == id) {
                parent.setSelection(i);
                break;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是我实例化这个类的方式:

CustomSpinner spinner = (CustomSpinner) findViewById(R.id.sphofentries);
Run Code Online (Sandbox Code Playgroud)

这在运行时给我一个错误.

所有这些都是R.id.sphofentries在我的布局中声明为微调器.

但是现在,如果我声明sphofentries为一个CustomSpinner运行时错误,就在我将布局设置为活动时:

setContentView(R.layout.settings);
Run Code Online (Sandbox Code Playgroud)

另外我很确定问题是我需要声明sphofentriesCustomSpinner因为如果我这样做:

CustomSpinner spinner = new CustomSpinner(this);
spinner = (CustomSpinner) findViewById(R.id.sphofentries);
Run Code Online (Sandbox Code Playgroud)

这通过第一行没有问题但是在第二行中出现运行时错误然后问题不是创建一个新的CustomSpinner但是sphofentries在此设置CustomSpinner(这与sphofentries声明Spinner为非a CustomSpinner).

也许我做错事的布局,这是我声明的方式sphofentriesCustomSpinner:

<CustomSpinner 
    android:id="@+id/sphofentries"
    android:layout_below="@+id/tvhofentries"
    android:layout_width="300dip"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
/>
Run Code Online (Sandbox Code Playgroud)

Fer*_*rCa 13

最后,有两个原因使其无法正常工作,之前的两个答案是正确的:

  1. 有必要使用AttributeSet参数定义第二个构造函数.

    public CustomSpinner(Context context, AttributeSet attrs) {
        super(context, attrs);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在布局中,Spinner必须定义为CustomSpinner,并且需要使用所有完全限定名称声明:

    <net.domain.package.CustomSpinner  
        android:id="@+id/sphofentries" 
        android:layout_below="@+id/tvhofentries"
        android:layout_width="300dip"       
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
    />
    
    Run Code Online (Sandbox Code Playgroud)


Cri*_*ian 9

这是一个常见的错误.只需添加此构造函数,即布局inflater调用的构造函数:

public CustomSpinner(Context context, AttributeSet attrs) {
    super(context, attrs);
}
Run Code Online (Sandbox Code Playgroud)