アプリの簡単な設定ページを作成しようとしています。SpinnerをListViewに動的に追加したときにSpinnerの選択したアイテムにアクセスするにはどうすればよいですか?
レイアウトをXMLファイルで定義するオブジェクトのリストを作成したいとします。
これらのオブジェクトのレイアウトには、タイトルTextView、ヘルプTextView、およびスピナーがあります。
私はこれらのオブジェクトをコードで動的に追加するので、これらの個々のSpinnerビューを参照して、選択した値を取得できるようにするにはどうすればよいですか?
私は現在の設定オブジェクト(リストが移入されるもの)があります。
public class Setting {
private String name;
private String description;
private String[] values;
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;
}
}
にビューにオブジェクトを設定する翻訳するカスタムArrayAdapterを:
(R.layout.spinner_row_text_layout.xmlがありますスピナーの項目のレイアウトを定義するための単なるテキストビュー)
public class SettingsAdapter extends ArrayAdapter<Setting> {
public SettingsAdapter(Context context, ArrayList<Setting> settings) {
super(context, 0, settings);
}
@Override
// Takes the position in the array, the view to convert, and the parent of the view as parameters
public View getView(int position, View convertView, ViewGroup parent) {
// Get the item in this position
Setting setting = getItem(position);
// Check if a view is being reused, otherwise inflate the view (look at view recycling in lists)
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.settings_row_view, parent, false);
}
// findViewById in the given view to convert
TextView title = (TextView) convertView.findViewById(R.id.titleText);
TextView help = (TextView) convertView.findViewById(R.id.helpText);
Spinner spinner = (Spinner) convertView.findViewById(R.id.spinner);
ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(getContext(), R.layout.spinner_row_text_layout, setting.getValues());
spinner.setAdapter(spinnerAdapter);
title.setText(setting.getName());
help.setText(setting.getDescription());
return convertView;
}
}
そして、次のレイアウトファイル...
設定ページレイアウト:各リストビュー項目の
<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>
レイアウト:私は設定ページのレイアウトに対応して活動を開始すると
<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)
at com.example.cgillions.counter.SettingsActivity。 onCreate android.app.Activity.performCreateで(SettingsActivity.java:46)
(Activity.java:5990)
これは私のonCreate(ある)メソッド:
@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);
}
エラーが発生した上最後の行 - たとえばID 'spinner'を持つビューが見つかりません(したがって、nullです)。私は間違ってSpinnerにアクセスしています - これをどうすればいいのかアドバイスできますか?
Spinnerオブジェクトを取得して、選択したアイテムを取得したいとします。
R.idspinnerはリストビュー内のレイアウトではなく、内部ビューのレイアウトであり、すべての行にSpinnerの新しいインスタンスがあります。なぜ、アクティビティにスピナーが必要ですか? (そして、どちらが1行目の行か2行目の行かなど) – CLucera
「内側のビューのレイアウトは何ですか?私は新しいインスタンスを持つ各行についてあなたが言っていることを知っています - どのように個々のリスト項目にアクセスしますか?この場合、最初のアイテムのスピナーが必要です(リスト内に1つの設定しかないので...) – Charlie
私は選択されたアイテムを引っ張り、別のアクティビティでビヘイビアを変更できるように、アクティビティのスピナーを必要としました。 – Charlie