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

时间:2010-12-25 01:31:23

标签: 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;
            }
        }
    }
}

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

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

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

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

但是现在,如果我将sphofentries声明为CustomSpinner,我只是在将布局设置为活动的时候出现运行时错误:

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"
/>

3 个答案:

答案 0 :(得分: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"
    />
    

答案 1 :(得分:9)

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

public CustomSpinner(Context context, AttributeSet attrs) {
    super(context, attrs);
}

答案 2 :(得分:2)

sphofentries是Spinner还是CustomSpinner

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

反过来会有效。您可以将CustomSpinner转换为Spinner,因为它是一个子类。