Android微调器和片段
我正在尝试创建一个具有2个微调器的应用程序。第一个微调将有1,2,3的选择。如果第一个微调器的选定值是1,那么第二微调器将具有a,b,c的值。如果第一个微调器的选定值是2,那么第二个将有d,e,f。如果1st = 3,那么2nd = g,h,i。我已经使用此代码创建这样的:Android微调器和片段
String[] categoryValues = new String[] { "1", "2", "3"};
String[] endurance = new String[] { "a", "b", "c"};
String[] strength = new String[] { "d", "e", "f"};
String[] balance = new String[] { "g", "h", "i"};
Spinner exercise = (Spinner)findViewById(R.id.exerciseS);
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
final ArrayList<String> list = new ArrayList<String>();
if(position == 0){
for (int i = 0; i < endurance.length; ++i) {
list.add(endurance[i]);
}
ArrayAdapter<String> adapterFT = new ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, list);
exercise.setAdapter(adapterFT);
adapterFT.notifyDataSetChanged();
}
else if(position == 1){
for (int i = 0; i < strength.length; ++i) {
list.add(strength[i]);
}
ArrayAdapter<String> adapterDST = new ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, list);
exercise.setAdapter(adapterDST);
adapterDST.notifyDataSetChanged();
}
else if(position == 2){
for (int i = 0; i < balance.length; ++i) {
list.add(balance[i]);
}
ArrayAdapter<String> adapterDST = new ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, list);
exercise.setAdapter(adapterDST);
adapterDST.notifyDataSetChanged();
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_exercise_picker);
Spinner category = (Spinner)findViewById(R.id.categoryS);
final ArrayList<String> list = new ArrayList<String>();
for (int i = 0; i < categoryValues.length; ++i) {
list.add(categoryValues[i]);
}
ArrayAdapter<String> adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, list);
category.setAdapter(adapter);
category.setOnItemSelectedListener(this);
}
我遇到的问题是,如何获取第二微调更改,恕不任何按钮片段的价值(不点击任何按钮)? layout image here
1微调=类别
第二微调] =运动
你为什么不这样做的一样,在第一次微调,并添加一个onItemSelected监听器?在该监听器上,您可以根据用户选择的内容创建或更新片段。
试试这个。
在第一微调OnItemSelected()调用的方法,并从第一微调该方法通过选择项目只是加载第二,适当的项目,并调用的setSelected如果u想在第二微调来选择特定的值
我不知道如果我很好地理解你的问题,但这是我所做的。我重新创建了解决方案。检查它是否符合您的需求。你可以问问是否需要调整。
在strings.xml
,我创建这些字符串数组
第一阵列串
<string-array name="first_spinner">
<item>1</item>
<item>2</item>
<item>3</item>
</string-array>
第二阵列串
<string-array name="second_spinner">
<item>a,b,c</item>
<item>d,e,f</item>
<item>g,h,i</item>
</string-array>
我在布局文件中添加了两个微调部件
<?xml version="1.0" encoding="utf-8"?>
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.inducesmile.myapplication4.MainActivity">
<Spinner
android:id="@+id/first_spinner"
android:layout_width="match_parent"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="4dp"
android:layout_height="wrap_content">
</Spinner>
<Spinner
android:id="@+id/second_spinner"
android:layout_width="match_parent"
android:layout_centerHorizontal="true"
android:layout_below="@+id/first_spinner"
android:layout_marginTop="24dp"
android:layout_height="wrap_content">
</Spinner>
</RelativeLayout>
在Activity页面中,我使用了这段代码。我使用的存储阵列以获得在微调B中选择的内容,如图
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private Spinner firstSpinner;
private Spinner secondSpinner;
private FragmentManager fragmentManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fragmentManager = getSupportFragmentManager();
firstSpinner = (Spinner)findViewById(R.id.first_spinner);
ArrayAdapter<CharSequence> firstAdapter = ArrayAdapter.createFromResource(this, R.array.first_spinner, android.R.layout.simple_spinner_item);
firstAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
firstSpinner.setAdapter(firstAdapter);
secondSpinner = (Spinner)findViewById(R.id.second_spinner);
ArrayAdapter<CharSequence> secondAdapter = ArrayAdapter.createFromResource(this, R.array.second_spinner, android.R.layout.simple_spinner_item);
secondAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
secondSpinner.setAdapter(secondAdapter);
firstSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
secondSpinner.setSelection(position);
String[] secondSpinnerContent = getResources().getStringArray(R.array.second_spinner);
Toast.makeText(MainActivity.this, "Value " + secondSpinnerContent[position], Toast.LENGTH_LONG).show();
switch(position){
case 0:
DefaultFragment firstFragment = new DefaultFragment();
fragmentManager.beginTransaction().replace(R.id.first_container, firstFragment).commit();
break;
case 1:
DefaultFragment secondFragment = new DefaultFragment();
fragmentManager.beginTransaction().replace(R.id.first_container, secondFragment).commit();
break;
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
}
让我知道,如果你有问题。
第二个微调器上的选项取决于在第一个微调器上选择的值。片段的内容依赖于第二个微调器。你的只是改变片段。我的只改变了第二个微调值。我想在更改微调框时更改片段内容。你有没有检查过我包括的布局?这可能有助于理解这个问题。 – newToAndroid
那么,我给你一个指向你的问题的指针,但似乎我不明白你需要什么。根据你的例子,微调器a和b中的映射是线性的,例如1 = a,b,c。如果它是这样的,那么它们具有相同的索引。您可以使用微调器a中的位置访问b中的数组内容。可能是你不明白我的解决方案。 – Inducesmile
我是否需要创建另一个onItemSelected侦听器? – newToAndroid
您可以创建一个新的,或使用现有的并基于视图进行区分。但我觉得有一个单独的听众是更清洁的。 – Francesc
你能告诉我应该如何创建另一个? – newToAndroid