Android 如何扩展微调器以实现新功能?
我试图在我的代码中扩展Android 如何扩展微调器以实现新功能?,android,android-spinner,Android,Android Spinner,我试图在我的代码中扩展SpinnerAndroid类来实现一个新函数,但由于某种原因,这没有起作用 这是扩展类: import android.content.Context; import android.widget.AdapterView; import android.widget.Spinner; public class CustomSpinner extends Spinner { public CustomSpinner(Context context) {
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;
}
}
}
}
这在运行时给了我一个错误
如果R.id.sphofentries
在我的布局中被声明为微调器,那么所有这些都会发生
但是现在,如果我将sphofentries
声明为CustomSpinner
,就在我将布局设置为活动的那一刻,我得到了一个运行时错误:
setContentView(R.layout.settings);
另外,我很确定问题在于我需要将sphofentries
声明为CustomSpinner
,因为如果我这样做:
CustomSpinner spinner = new CustomSpinner(this);
spinner = (CustomSpinner) findViewById(R.id.sphofentries);
这在第一行没有问题,但在第二行出现运行时错误,那么问题不是创建新的CustomSpinner
,而是在此CustomSpinner
中设置sphofentries
(这与sphofentries
声明为Spinner
的情况类似)
也许我在布局中做错了什么,这就是我将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"
/>
这是一个常见的错误。只需添加此构造函数,即布局充气器调用的构造函数:
public CustomSpinner(Context context, AttributeSet attrs) {
super(context, attrs);
}
sphofentries是
微调器还是自定义微调器
它需要在布局中声明为CustomSpinner
,以便在代码中将其转换为CustomSpinner
另一种方法是可行的。您可以将自定义微调器
转换为微调器
,因为它是一个子类。最后,有两个原因导致它无法正常工作,前面的两个答案是正确的:
还需要使用AttributeSet参数定义第二个构造函数
public CustomSpinner(Context context, AttributeSet attrs) {
super(context, attrs);
在布局中,微调器必须定义为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"
/>
考虑到你的答案,我编辑了这个问题。也许我在布局中做错了什么?我以前在布局中也做过同样的事情,而且效果很好,唯一的区别是我必须使用完全限定的名称空间(或者包,或者在java中调用的任何名称空间)。尝试在布局中使用完全限定的名称,看看这是否会有所不同。(即,我尝试了此操作,但调试器甚至无法输入此函数(而不是另一个)。我将问题编辑到我已完成的测试中。CustomSpinner spinner=新建CustomSpinner(此);spinner=(CustomSpinner)findViewById(R.id.sphofentries);表示您不了解android的工作原理。在尝试编写自己的小部件之前,我建议您阅读并测试基本示例。@fishjd好的,进行了更改。是否有方法避免使用完全限定名称?声明、导入某些内容,在某处?
<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"
/>