我正在尝试在我的代码中扩展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;
            }
        }
    }
}

这就是我实例化此类的方式:
CustomSpinner spinner = (CustomSpinner) findViewById(R.id.sphofentries);

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

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

但是现在,如果我将sphofentries声明为CustomSpinner,则在将Layout设置为Activity的那一刻,我会遇到运行时错误:
setContentView(R.layout.settings);

我也很确定问题在于我需要将sphofentries声明为CustomSpinner,因为如果这样做,则:
CustomSpinner spinner = new CustomSpinner(this);
spinner = (CustomSpinner) findViewById(R.id.sphofentries);

这在第一行中没有问题,但在第二行中给出了运行时错误,然后问题不是创建新的CustomSpinner,而是在此sphofentries中设置了CustomSpinner(这与sphofentries声明为Spinner而不是CustomSpinner一样)。

也许我在布局中做错了,这就是我将sphofentries声明为CustomSpinner的方式:
<CustomSpinner
    android:id="@+id/sphofentries"
    android:layout_below="@+id/tvhofentries"
    android:layout_width="300dip"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
/>

最佳答案

最后,有两个原因导致此操作无法正常工作,前面的两个答案是正确的:

  • 还必须使用AttributeSet参数定义第二个构造函数。
    public CustomSpinner(Context context, AttributeSet attrs) {
        super(context, attrs);
    
  • 在布局中,必须将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"
    />
    
  • 09-27 03:31