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监听器?在该监听器上,您可以根据用户选择的内容创建或更新片段。

+0

我是否需要创建另一个onItemSelected侦听器? – newToAndroid

+1

您可以创建一个新的,或使用现有的并基于视图进行区分。但我觉得有一个单独的听众是更清洁的。 – Francesc

+0

你能告诉我应该如何创建另一个? – newToAndroid

试试这个。
在第一微调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) { 

     } 
    }); 
    } 
} 

让我知道,如果你有问题。

+0

第二个微调器上的选项取决于在第一个微调器上选择的值。片段的内容依赖于第二个微调器。你的只是改变片段。我的只改变了第二个微调值。我想在更改微调框时更改片段内容。你有没有检查过我包括的布局?这可能有助于理解这个问题。 – newToAndroid

+0

那么,我给你一个指向你的问题的指针,但似乎我不明白你需要什么。根据你的例子,微调器a和b中的映射是线性的,例如1 = a,b,c。如果它是这样的,那么它们具有相同的索引。您可以使用微调器a中的位置访问b中的数组内容。可能是你不明白我的解决方案。 – Inducesmile