10

我正在尝试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在我的布局中声明为微调器。

但是现在,如果我将 Layout 设置为 Activity 时,我会收到运行时错误sphofentriesCustomSpinner

setContentView(R.layout.settings);

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

CustomSpinner spinner = new CustomSpinner(this);
spinner = (CustomSpinner) findViewById(R.id.sphofentries);

这在第一行没有问题,但在第二行给出了运行时错误,然后问题不是创建一个新的CustomSpinner而是sphofentries在 this 中设置CustomSpinner(Thissphofentries声明为 a Spinnernot a 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"
/>
4

3 回答 3

13

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

  1. 还需要使用 AttributeSet 参数定义第二个构造函数。

    public CustomSpinner(Context context, AttributeSet attrs) {
        super(context, attrs);
    
  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"
    />
    
于 2010-12-26T22:16:29.207 回答
9

这是一个常见的错误。只需添加这个构造函数,它是布局充气器调用的构造函数:

public CustomSpinner(Context context, AttributeSet attrs) {
    super(context, attrs);
}
于 2010-12-25T01:37:55.400 回答
2

shofentries 是 aSpinner还是 a CustomSpinner

它需要CustomSpinner在您的布局中声明为 a ,以便您CustomSpinner在代码中将其转换为 a 。

反过来也行。您可以将 a 转换CustomSpinner为 a Spinner,因为它是一个子类。

于 2010-12-25T17:55:00.523 回答