Android : SetSelection은 스피너에 영향을 미치지 않습니다
문제
스피너에서 setSelection에 문제가 있습니다. 스피너가 코드에 표시 될 때 값을 사전 선택하도록 설정했지만 효과가 없으며 목록의 첫 번째 대안이 항상 선택됩니다. 코드는 다음과 같습니다.
LayoutInflater li = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View dialogView = li.inflate(R.layout.edit_event, null);
...
ArrayList<String> routes = new ArrayList<String>();
// routes filled with values at runtime
...
ArrayAdapter<String> aa = new ArrayAdapter<String>(GOFdroid.this, android.R.layout.simple_spinner_item, routes);
aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
Spinner destSpinner = (Spinner) dialogView.findViewById(R.id.edit_event_destination);
String dest = events.get(pos).getDestination();
int routesPos = routes.indexOf(dest);
Log.d(TAG, "Dest: " + dest + ", pos: " + routesPos);
destSpinner.setSelection(routesPos);
destSpinner.setAdapter(aa);
코드는 setSelection-part를 제외하고 의도 된대로 작동하며 그 이유를 알 수 없습니다.
스피너의 XML 층은 다음과 같습니다 (전체 레이아웃이 아니라 스피너 부품 만) :
// DESTINATION
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Destination:" />
<Spinner
android:id="@+id/edit_event_destination"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:prompt="@string/choose_dest"
android:layout_marginBottom="10dip"
android:text="" />
도움을 주셔서 감사합니다!
리누스
해결책
전화를 옮기십시오 setSelection()
전화 후 setAdapter()
.
다른 팁
나는 비슷한 문제가 있었다. 나의 경우에는 setAdaper
그리고 setSelection
올바른 순서대로! 실행 된 양식 onCreate
효과가 있었지만 실행되었을 때 onResume
효과가 없었습니다.
그만큼 해결책 전화하는 것입니다 setSelection(my_pos, true)
. 두 번째 매개 변수를 주목하십시오.
당신은 시도 할 수 있습니다
mSpinner.post(new Runnable() {
public void run() {
mSpinner.setSelection(1);
}
});
이것은보기가 만들어 지 자마자 실행할 수있는 런 가능한 조치를 게시합니다.
내 경우에는 답이 없었기 때문에 핸들러를 통해 setSelection을 대기했습니다.
new Handler().postDelayed(new Runnable() {
public void run() {
mSpinner.setSelection(1);
}
}, 100);
이 작업을 수행하면 느린 장치에서 실행할 때 문제가 발생할 수 있지만 특정 장치에서 일하고 있어이 해킹을 사용해도 괜찮습니다.
해결책은 setSelection (my_pos, true)을 호출하는 것입니다. 두 번째 매개 변수를 주목하십시오.
잊지 마십시오. 애니메이션을 호출하면 설정 레이아웃 매개 변수를 잊지 마십시오. :) 예 : 예 :
LinearLayout.LayoutParams spinnerLp = (LinearLayout.LayoutParams) spinner.getLayoutParams();
spinner.setSelection(selectedPositionAge, true);
spinnerLp.gravity = Gravity.CENTER;
spinner.setLayoutParams(spinnerLp);
수동으로 설정된 패딩을 스피너로 수동으로 재설정해야합니다.
나는 내부의 스피너와 같은 문제가 있었다. fragment : setSelection
그 동안 올바르게 작동합니다 onCreate
활동이 처음 시작될 때 화면을 회전 할 때는 아닙니다. 나는 전화하여 그것을 해결했다 setSelection
내 onViewStateRestored
조각 내부를 호출하는 대신 조각의 방법 onCreate
방법. 확실하지 않지만 당신이 사용할 수 없다고 생각합니다 setSelection
가능하더라도보기가 완전히로드 될 때까지 findViewById
그것.
Spinner.setSelection()
전에 전화하면 작동하지 마십시오 Spinner.setAdapter()
전화 해보세요 setSelection()
setAdapter ()로 호출 한 후.
이 뒤에 이유 : 전화 할 때 Spinner.Selection()
어댑터를 설정하기 전에 단순히 데이터가 포함되어 있지 않거나 Spinner가 Max Item = 0이라고 말할 수있는 경우 SetSelection ()에 의해 Spinner를 사용자 정의 색인으로 설정하려고한다는 것을 의미합니다.
그래서 setSelection(1)
최대 항목 = 0 인 스피너의 경우 인덱스를 1으로 설정하는 것을 의미합니다. Spinner 자체 가이 OutfboundIndex를 처리하므로 앱이 충돌하지 않습니다.
~에게 전화 해 SetSelection()
SetAdapter () 만 이후에 있어야합니다
또한 당신이있는 경우 Spinner.SetOnItemSelectedListener()
그리고 당신은 그 문제가 있습니다 onItemSelected(AdapterView<?> parent, View view, int position, long id)
활동 하중이있을 때 위치 값 = 0으로 tggerged 후이 패턴을 사용해야합니다.
Spinner.SetAdapter()
Spinner.setSelection();
Spinner.setOnItemSelectedListener();
이것을 사용하십시오
sp2.setAdapter(sp2.getAdapter());
sp2.getAdapter().notifyDataSetChanged();
sp2.setSelection(0, false);
이전 답변 중 어느 것도 저에게 도움이되지 않았습니다. 그러나 인스턴스 변수를 만드는 것이 효과가있는 것은 mSpinner
에서 onCreateView()
내 조각의 방법 (또는 onCreate()
당신의 활동 방법) onLoadFinished()
방법...
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
adapter.swapCursor(cursor);
//mSpinner.setAdapter(adapter);
mSpinner.setSelection(mSelectedIndex);
}
이것을 시도해보십시오. 그것은 나를 위해 일했습니다.
Spinner destSpinner = (Spinner)dialogView.findViewById(R.id.edit_event_destination);
destSpinner.setSelection(0);
String dest = events.get(pos).getDestination();
int routesPos = routes.indexOf(dest);
destSpinner.setAdapter(aa);
Log.d(TAG, "Dest: " + dest + ", pos: " + routesPos);
destSpinner.setSelection(routesPos);
때로는 스피너가 특정 값으로 설정되고 요구 사항에 따라 비활성화 될 수 있으므로 청취자를 설정하지 않을 수도 있습니다.
리스너가 필요하기 때문에 값을 선택하지 않고 setSelection ()로 이어질 수 있습니다.
스피너의 setonitemelectedListener ()가 아래와 같이 사용자 정의 리스너로 설정되어 있는지 확인하십시오.
Spinner가 비활성화 되더라도 아래와 같은 리스너를 설정하여 setSelection () 메소드가 작동하도록해야합니다.
spinnerListener.setOnItemSelectedListener(spinnerListener);
AdapterView.OnItemSelectedListener spinnerListener = new
AdapterView.OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {
//Your code
}
}
spinnerListener.setSelection(0);