Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何扩展微调器以实现新功能?_Android_Android Spinner - Fatal编程技术网

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