Java 如何访问微调器&x27;当I';是否已将微调器动态添加到ListView?

Java 如何访问微调器&x27;当I';是否已将微调器动态添加到ListView?,java,android,android-layout,listview,android-spinner,Java,Android,Android Layout,Listview,Android Spinner,我正在尝试为应用程序创建一个简单的设置页面 我想创建一个对象列表,在XML文件中定义其布局 在这些对象的布局中有一个标题文本视图、一个帮助文本视图和一个微调器 在代码中动态添加这些对象时,如何引用这些单独的微调器视图,以便获得选定的值 我当前有一个设置对象(列表将填充的内容): 用于将设置对象转换为视图的自定义ArrayAdapter: (R.layout.spinner\u row\u text\u layout.xml只是一个文本视图,用于定义微调器项的布局) 公共类设置适配器扩展了Arra

我正在尝试为应用程序创建一个简单的设置页面

我想创建一个对象列表,在XML文件中定义其布局

在这些对象的布局中有一个标题文本视图、一个帮助文本视图和一个微调器

在代码中动态添加这些对象时,如何引用这些单独的微调器视图,以便获得选定的值

我当前有一个设置对象(列表将填充的内容):

用于将设置对象转换为视图的自定义ArrayAdapter:

(R.layout.spinner\u row\u text\u layout.xml只是一个文本视图,用于定义微调器项的布局)

公共类设置适配器扩展了ArrayAdapter{
公共设置适配器(上下文、数组列表设置){
超级(上下文,0,设置);
}
@凌驾
//将阵列中的位置、要转换的视图以及视图的父视图作为参数
公共视图getView(int位置、视图转换视图、视图组父视图){
//在这个位置获取项目
设置=获取项目(位置);
//检查视图是否被重用,否则将视图充气(查看列表中的视图循环)
if(convertView==null){
convertView=LayoutInflater.from(getContext()).flate(R.layout.settings\u row\u view,parent,false);
}
//要转换的给定视图中的findViewById
TextView title=(TextView)convertView.findViewById(R.id.titleText);
TextView帮助=(TextView)convertView.findViewById(R.id.helpText);
微调器微调器=(微调器)convertView.findViewById(R.id.Spinner);
ArrayAdapter spinnerAdapter=新的ArrayAdapter(getContext(),R.layout.spinner\u row\u text\u layout,setting.getValues());
spinner.setAdapter(spinnerAdapter);
title.setText(setting.getName());
help.setText(setting.getDescription());
返回视图;
}
}
以及以下布局文件

设置页面布局:

<RelativeLayout

    android:id="@+id/relativeLayout"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.cgillions.counter.SettingsActivity">

    <ListView
        android:id="@+id/settingsList"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:choiceMode="singleChoice"
        android:divider="@color/black"
        android:dividerHeight="5dp"/>

</RelativeLayout>

每个ListView项目的布局:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1">

        <TextView
            android:id="@+id/titleText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"

            android:text="Hello"
            android:textSize="20sp"
            android:textColor="@color/black"

            android:gravity="center_vertical"/>

        <TextView
            android:id="@+id/helpText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"

            android:text="@string/animation_settings_hint"
            android:textSize="12sp"
            />

    </LinearLayout>

    <Spinner
        android:id="@+id/spinner"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1.5"/>

</LinearLayout>

启动与设置页面布局对应的活动时,出现以下错误:

位于junit.framework.Assert.assertNotNull(Assert.java:211)

位于com.example.cgillions.counter.SettingsActivity.onCreate(SettingsActivity.java:46)

位于android.app.Activity.performCreate(Activity.java:5990)

这是我的onCreate()方法:

@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u设置);
setTitle(“设置”);
//创建新的设置对象以填充列表
animSetting=新设置(“动画”,getResources().getString(R.string.Animation\u settings\u提示),getResources().getStringArray(R.array.anim\u值));
设置=新建ArrayList();
设置。添加(动画设置);
ListView设置列表=(ListView)findViewById(R.id.settingsList);
assertNotNull(设置列表);
settingsList.setAdapter(新的SettingsAdapter(此,设置));
animSpinner=(微调器)设置List.findViewById(R.id.Spinner);
assertNotNull(animSpinner);
}
错误发生在最后一行-例如,找不到ID为“spinner”的视图(因此为空)。我对微调器的访问不正确-有人能建议我如何操作吗


我想获取微调器对象,以便获取所选项目。

您可以尝试的内容。将微调器实例添加到设置类:

public class Setting {

    private String name;
    private String description;
    private String[] values;
    private Spinner spinner;

    public Setting(String name, String description, String[] values) {
        this.name = name;
        this.description = description;
        this.values = values;
    }

    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }

    public String[] getValues() {
        return values;
    }

    public void setSpinner(Spinner s) {
        spinner = s;
    }

    public Spinner getSpinner() {
        return spinner;
    }
}
然后,在getView()方法中,为设置实例提供微调器:

ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(getContext(), R.layout.spinner_row_text_layout, setting.getValues());
spinner.setAdapter(spinnerAdapter);
if (setting.getSpinner() == null) {
    setting.setSpinner(spinner);
}
ArrayAdapter spinnerAdapter=新的ArrayAdapter(getContext(),R.layout.spinner\u row\u text\u layout,setting.getValues());
spinner.setAdapter(spinnerAdapter);
if(setting.getSpinner()==null){
设置。固定销(旋转器);
}
然后,假设可以访问设置列表,则可以访问与每个设置关联的微调器。如果您发现一个带有空微调器的设置,那么它永远不会出现在活动中,这意味着用户永远不会更改它。但我不知道这是否真的是你想要的


这将允许您访问每个设置的微调器,但您没有用于存储用户选择或在微调器中设置所选项目的逻辑。也就是说,如果微调器有选项A、B和C,并且用户选择了B,那么您现在可以读取B,但没有存储它的位置。Setting类应该有一个用于保存所选值的字段。您的getView()方法应该调用
spinner.setSelection()
,告诉它将B显示为当前值。否则,无论用户以前选择了什么,它都将始终显示。

R.id.spinner不是listview中的布局,而是内部视图的布局,并且每行都有一个新的微调器实例,为什么在活动中需要微调器?(哪一个?第一排?第二排?等等)你说的“是内部视图的布局”是什么意思?我知道你说的每一行都有一个新实例——我如何访问每个单独的列表项?在这种情况下,我需要第一个项目的微调器(因为我在列表中只有一个设置…)我需要活动中的微调器,以便我可以拉动所选项目并更改不同活动上的行为。在代码中,您试图在活动的onCreate方法中获取每个微调器的所选项目。这是您要读取所选项目的位置吗?如果没有,您可以将回调对象传递给
设置适配器
,并在微调器的
setOnItemSelectedListener
中使用此对象。这将允许您在更改每个微调器时执行任何操作。@Matthew因此,在我的设置适配器中,我创建了一个onClick侦听器,每次创建
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_settings);

    setTitle("Settings");

    // Create a new Setting object in order to populate list
    animSetting = new Setting("Animation", getResources().getString(R.string.animation_settings_hint), getResources().getStringArray(R.array.anim_values));

    settings = new ArrayList<>();
    settings.add(animSetting);

    ListView settingsList = (ListView) findViewById(R.id.settingsList);
    assertNotNull(settingsList);
    settingsList.setAdapter(new SettingsAdapter(this, settings));

    animSpinner = (Spinner) settingsList.findViewById(R.id.spinner);
    assertNotNull(animSpinner);
}
public class Setting {

    private String name;
    private String description;
    private String[] values;
    private Spinner spinner;

    public Setting(String name, String description, String[] values) {
        this.name = name;
        this.description = description;
        this.values = values;
    }

    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }

    public String[] getValues() {
        return values;
    }

    public void setSpinner(Spinner s) {
        spinner = s;
    }

    public Spinner getSpinner() {
        return spinner;
    }
}
ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(getContext(), R.layout.spinner_row_text_layout, setting.getValues());
spinner.setAdapter(spinnerAdapter);
if (setting.getSpinner() == null) {
    setting.setSpinner(spinner);
}