2011-05-07 4 views

답변

1

해결책이 있습니다. 구현하는 데 시간이 오래 걸릴 수도 있지만 완벽하게 작동 할 것입니다.

귀하의 ActivityOne.class에는 spinner_one이 있고 ActivityTwo.class에는 spinner_two가 있다고 가정 해 보겠습니다. 그리고 spinner_1에서 선택한 항목을 기반으로 spinner_2를 채 웁니다.

spinner_2에 대한 다음

지금

spinner_1.setOnItemSelectedListener(new OnItemSelectedListener() { 

     @Override 
     public void onItemSelected(AdapterView<?> arg0, View arg1, 
        int arg2, long arg3) {    

       // save your selected item into a SharedPreference Variable 
     }  
     @Override 
     public void onNothingSelected(AdapterView<?> arg0) { 

     } 
}); 

:

String spinner1_value=get value from SharedPreference; 
if(spinner1_value.equals("something_1")) 
{ 
    //populate spinner_2 accordingly 
} 
else if(spinner1_value.equals("something_2")) 
{ 
    //populate spinner_2 accordingly 
} 
else 
{ 
    //populate spinner_2 accordingly 
} 

그리고, 당신의 ActivityTwo.class의 onResume에서 spinner_2()을 채우기 위해이 코드를 삽입하는 것을 잊지 않는 때문에 사용자가 spinner_1 값에서 변경 한 내용을 반영합니다.

이렇게하면 spinner_1의 값을 spinner_1 값에 따라 변경할 수 있습니다.

1

간단히 말해서 새로운 ArrayAdapter를 Spinner에 할당하거나 기존 ArrayAdapter에서 항목을 제거/추가하여 프로그래밍 방식으로이 작업을 수행 할 수 있습니다.

더 긴 대답은 OnItemSelectedListener.onItemSelected()에 의존 할 때 매우 신중해야한다는 것입니다. 예전 선택과 새로운 선택이 같은 위치에 있으면 호출되지 않기 때문입니다. Spinner.getSelectedItemPosition(), 즉, 항목을 즉시 제거하는 경우 실제로 ArrayAdapter의 항목 수보다 큰 위치를 반환 할 수 있기 때문입니다.

나는 3 개의 계단식 스피너로 구성된 시스템을 가지고 있으며, 차례로 다른 버튼과 텍스트의 내용을 구동 할 수 있습니다. 위의 내용을 인식하고 권위 있고 무엇이 아닌지에 대한 내 견해를 바꿀 때까지는 95 %의 해결책을 얻을 수있었습니다. Spinner가 내용을 결정하는 논리에 종속되도록 만들었습니다. 따라서 setSelection()을 호출하고 onItemSelected() 콜백에 의존하는 대신 모든 연쇄 논리를 처리기 외부에서 수행 한 다음 setSelection()을 호출하고 체인을 백업합니다. 여기 작은 내용을 떠 났어요

class Spinster extends Activity { 
    ... 
    private void setSpinnerOne(int pos) { 
     // 1. Do our own chores, etc 
     doSomeStuff(); 
     mSomeText.setText("Blah!"); 
     mSomeButton.setEnabled(some_condition); 

     // 2. Populate dependent Spinner based on pos 
     populateSpinnerTwoAdapter(pos); 

     // 3. Cascade by calling SpinnerTwo logic (not the Spinner itself) 
     lSpinnerTwoPos = someNiceFunction(); 
     setSpinnerTwo(lSpinnerTwoPos); 

     // 4. Now set SpinnerOne 
     mSpinnerTwo.setSelection(pos); 
    } 

    private void setSpinnerTwo(int pos) { 
     // Follows the same pattern as setSpinnerOne(), but cascades to SpinnerThree 
    } 

    private void setSpinnerThree(int pos) { 
     // Follows the same pattern as setSpinnerOne(), but need not cascade 
    } 

    ... 

    private OnItemSelectedListener item_select = new OnItemSelectedListener() { 
     public void onItemSelected(AdapterView parent, View v, int position, long id) 
      { 
      ... 
      int lId = parent.getId(); 

      if (lId == R.id.spinner_one) { 
       setSpinnerOne(position); 
      } else if (lId == R.id.spinner_two) { 
       setSpinnerTwo(position); 
      } else if (lId == R.id.spinner_three) { 
       setSpinnerThree(position); 
      } 
     } 
    } 

} 

, 그 방법을 설정하고)합니다 (setSpinner의 *에서 가드 변수를 삭제의 그들이 무엇을 귀찮게하지 않도록 :

내 작업 코드에서 적응 onSelectedItemListener()가 다시 호출 할 때 모든 작업이 다시 수행됩니다. 기본 논리를 버리면 쉽게 표시 할 수 있다고 생각합니다. (그리고 그들은하지 엄격가 필요 -. onItemSelected()가 두 번째 라운드 호출되지 않습니다)이이 추상적으로 간주되는 경우 내가 진짜, 작업 예제를 게시 할 수

.

관련 문제