コードでスピナードロップダウンを使用しています。ここでは、4〜5個の動的に入力された値があります。たとえば、「リンゴ」をデフォルトに設定し、ドロップダウンから「オレンジ」を選択して、画面を縦向きから横向きに回転すると、関連付けられたビューとともにデフォルトの「りんご」に戻ります。「オレンジ」を選択して横向きに回転すると、選択した値が入力され、同じ選択状態のままになり、ビューが維持されるように状態を保存するにはどうすればよいですか。選択した値に対応するポートレートモードで選択されたビューをそのまま/入力します。これが私が同じために使用するアダプタコードです:
public class MarketsSpinnerAdapter extends CustomRowAdapter<AdapterRow> {
private List<AdapterRow> mRenderList;
public MarketsSpinnerAdapter(final Context context, final List<AdapterRow> renderList) {
super(context);
mRenderList = new ArrayList<AdapterRow>();
mRenderList.addAll(renderList);
}
@Override
protected void setEntries(final List<AdapterRow> renderList) {
mRenderList = renderList;
}
@Override
protected List<AdapterRow> getEntries() {
return mRenderList;
}
@Override
public View getDropDownView(final int position, final View convertView, final ViewGroup parent) {
return getEntries().get(position).getDropDownView(mContext, convertView);
}
}
それぞれのフラグメントでの対応する使用法:
private void populateCategoryRows(final Cursor cursor) {
mCategories.clear();
mAllCategories.clear();
cursor.moveToPosition(-1);
Map<String, String> categoryParentNames = new HashMap<String, String>();
int selectedPosition = 0;
String previousHeader = "";
String previousAllHeader = "";
while (cursor.moveToNext()) {
final int categoryLevel = cursor.getInt(cursor.getColumnIndex(MarketsCategory.Columns.LEVEL));
final String categoryName = cursor.getString(cursor.getColumnIndex(MarketsCategory.Columns.NAME));
final String categoryDisplayName = cursor.getString(cursor.getColumnIndex(MarketsCategory.Columns.DISPLAY_NAME));
if (categoryLevel == 1) {
categoryParentNames.put(categoryName, categoryDisplayName);
}
}
cursor.moveToPosition(-1);
while (cursor.moveToNext()) {
final int categoryLevel = cursor.getInt(cursor.getColumnIndex(MarketsCategory.Columns.LEVEL));
final boolean categoryIsDefault = cursor.getInt(cursor.getColumnIndex(MarketsCategory.Columns.IS_DEFAULT)) == 1;
final boolean categoryIsSelected = cursor.getInt(cursor.getColumnIndex(MarketsCategory.Columns.IS_SELECTED)) == 1;
final String categoryParent = cursor.getString(cursor.getColumnIndex(MarketsCategory.Columns.PARENT));
final String categoryName = cursor.getString(cursor.getColumnIndex(MarketsCategory.Columns.NAME));
final String categoryDisplayName = cursor.getString(cursor.getColumnIndex(MarketsCategory.Columns.DISPLAY_NAME));
if (categoryLevel == 2 ) {
String categoryParentDisplayName = categoryParentNames.get(categoryParent);
if (!categoryParent.equals(previousHeader)) {
if (categoryIsSelected) {
mCategories.add(new CategoryHeader(categoryParentDisplayName));
previousHeader = categoryParent;
}
}
if (!categoryParent.equals(previousAllHeader)) {
mAllCategories.add(new CategoryHeader(categoryParentDisplayName));
previousAllHeader = categoryParent;
}
if (categoryIsSelected) {
mCategories.add(new SpinnerMarketCategoryRow(categoryName, categoryDisplayName, categoryParent));
}
mAllCategories.add(new MarketsCategoryCheckableRow(categoryName, categoryDisplayName, categoryIsSelected, categoryIsDefault));
if(categoryIsDefault){
selectedPosition = mCategories.size()-1;
}
}
}
mSpinnerAdapter = new MarketsSpinnerAdapter(Application.getAppContext(), mCategories);
headerView.setSpinnerAdapter(mSpinnerAdapter);
headerView.setSpinnerSelectedItemPosition(selectedPosition);
}
if (selectedItem instanceof SpinnerMarketCategoryRow) {
selectedCategory = (SpinnerMarketCategoryRow) mSpinnerAdapter.getItem(position);
} else {
if (mSpinnerAdapter.getCount() - 1 >= position + 1) {
selectedCategory = (SpinnerMarketCategoryRow) mSpinnerAdapter.getItem(position + 1);
} else {
selectedCategory = (SpinnerMarketCategoryRow) mSpinnerAdapter.getItem(position - 1);
}
}
final MarketsFragment parentFragment = (MarketsFragment) getParentFragment();
parentFragment.onCategorySelected(selectedCategory.getCategoryName(), selectedCategory.getCategoryParentName());
}
@Override
public void showResults(final Uri uri) {
LayoutUtils.showResults(getView(), headerView.getSpinnerId());
headerView.setVisibility(View.VISIBLE);
}
@Override
public void showNoResults(final Uri uri) {
final MarketsFragment parentFragment = (MarketsFragment) getParentFragment();
parentFragment.hideSpinner();
//LayoutUtils.showNoResult(getView(), headerView.getSpinnerId());
}
@Override
public void onDismiss(DialogInterface dialog) {
headerView.setSelected(false);
}
@Override
public void onNothingSelected(IcsAdapterView<?> parent) {
}
何か案は?
ありがとう!
あなたはこれを次のように行うことができます...
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("yourSpinner", yourSpinner.getSelectedItemPosition());
// do this for each or your Spinner
// You might consider using Bundle.putStringArray() instead
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// initialize all your visual fields
if (savedInstanceState != null) {
yourSpinner.setSelection(savedInstanceState.getInt("yourSpinner", 0));
// do this for each of your text views
}
}
お役に立てれば
デバイスの構成( Resources.Configuration クラスで定義)が変更された場合、ユーザーインターフェイスを表示するものはすべて、その構成に一致するように更新する必要があります。そのため、Activity
それ以外の場合は、構成の変更(画面の向き、言語、入力デバイスなどの変更など)により、現在のアクティビティが破棄され、onPause(の通常の_Activity lifecycle process
_が実行されます。 )、onStop()、およびonDestroy()を必要に応じて。
アクティビティがフォアグラウンドにあるか、ユーザーに表示されている場合、そのインスタンスでonDestroy()が呼び出されると、アクティビティの新しいインスタンスが作成されますsavedInstanceState前のインスタンスがonSaveInstanceState(Bundle)
から生成しました。
これが行われるのは、レイアウトファイルを含むすべてのアプリケーションリソースが、任意の構成値に基づいて変更される可能性があるためです。いくつかの特別な場合(あなたのように、私が正しければ、現在のUIにスピナー/ドロップダウンしかなく、完全なアクティビティライフサイクルを実行する必要がない場合)、1つに基づいてアクティビティの再開をバイパスすることができます以上のタイプの構成変更。これは、マニフェストのAndroid:configChanges属性を使用して実行されます。また、onSaveInstanceState)を使用することもできます。 (バンドル)これは、アクティビティが破棄され、開始から再作成されたときに呼び出されます。
この問題を解決するには、2つの方法があります_
_1_
_
- アクティビティタグのマニフェストファイルにAndroid:configChanges = "orientation"を追加します。
_ <?xml version="1.0" encoding="utf-8"?>
<manifest ...
>
<application ...
>
<activity
Android:name="SpinnerActivity"
Android:configChanges="orientation" >
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
_
- 2、オーバーライドonConfigurationChanged。これは、アクティビティ中にデバイス構成が変更されたときにシステムによって呼び出されます。ランニング。
_ @Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
int orientation = newConfig.orientation;
switch (orientation) {
case Configuration.ORIENTATION_LANDSCAPE:
// do what you want when user is in LANDSCAPE
break;
case Configuration.ORIENTATION_PORTRAIT:
// do what you want when user is in PORTRAIT
break;
}
}
_
_2_
_
Putメソッドを使用して、onSaveInstanceState()に値を格納します。
_protected void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
//Put your spinner values to restore later...
savedInstanceState.putLong("yourSpinnerValKey", yourSpinner.getSelectedItemPosition());
}
_
そして、onCreate()で値を復元します。
_public void onCreate(Bundle savedInstanceState) {
if (savedInstanceState!= null) {
//get your values to restore...
value = savedInstanceState.getLong("param");
}
}
_
これにより問題は確実に解決され、画面の向きが変わってもスピナーは更新されません。これがあなたとすべての人に役立つことを願っています! :)