style - spinner android شرح




كيف أحافظ على حالة عنصر محدد/عنصر منسدل في تغيير الاتجاه؟ (2)

يمكنك القيام بذلك مثل ...

@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
    }
}

أتمنى أن يساعدك هذا

أنا باستخدام القائمة المنسدلة الدوار في بلدي التعليمات البرمجية، التي لدي 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) {
    }

أيه أفكار؟

شكر!


إذا تغير تكوين الجهاز (كما هو محدد من قبل فئة Resource.Configuration )، فسيحتاج أي شيء يعرض واجهة مستخدم إلى التحديث لمطابقة هذا التهيئة ونشاطك ما لم تحدد غير ذلك، فإن تغيير التكوين (مثل تغيير في اتجاه الشاشة، واللغة، وأجهزة الإدخال، وما إلى ذلك) يؤدي إلى تدمير النشاط الحالي الخاص بك، والذهاب من خلال Activity lifecycle process العادي أونبوس () و أونستوب () و أونديستروي () حسب الاقتضاء.

إذا كان النشاط قد تم في المقدمة أو مرئية للمستخدم، مرة واحدة أونديستروي () يسمى في ذلك المثيل ثم سيتم إنشاء مثيل جديد من النشاط، مع ما سافيدينستانسيستات المثيل السابق قد ولدت من onSaveInstanceState(Bundle) .

ويتم ذلك لأن أي مورد تطبيق، بما في ذلك ملفات تخطيط، يمكن أن تتغير استنادا إلى أي قيمة التكوين. في بعض الحالات الخاصة (تماما مثل الخاص بك، إذا كنت الحصول على الحق، إذا كنت تواجه سوى الدوار / المنسدلة على واجهة المستخدم الحالية وأنت لا تحتاج إلى الخضوع لدورة حياة النشاط الكامل)، قد ترغب في تجاوز إعادة تشغيل النشاط الخاص بك على أساس واحد أو أكثر من أنواع التغييرات التكوين. ويتم ذلك مع الروبوت: كونفيغتشانجيس السمة في بيانها و / أو يمكنك أيضا استخدام أونزافينستانستات (حزمة) وهو المتصل عندما يتم تدمير النشاط وإعادة إنشائها من التسول.

لديك ببساطة طريقين لحل هذه المشكلة_

1_

    1. إضافة أندرويد: كونفيغشانجيس = "أورينتاتيون" في ملف مانيفيست من علامة نشاطك.
 <?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، تجاوز أونكونفيغوراتيونشانجد ، الذي يسمى من قبل النظام عندما يتغير تكوين الجهاز أثناء تشغيل النشاط الخاص بك.
 @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_

استخدام أساليب وضع لتخزين القيم في أونزافينستانستات ():

protected void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    //Put your spinner values to restore later...
    savedInstanceState.putLong("yourSpinnerValKey", yourSpinner.getSelectedItemPosition());
}

واستعادة القيم في أونكريت ():

public void onCreate(Bundle savedInstanceState) {
    if (savedInstanceState!= null) {
     //get your values to restore...
        value = savedInstanceState.getLong("param");
    }
}

وهذا بالتأكيد يحل مشكلتك، وأنه لن تحديث الدوار الخاص بك عند تغيير اتجاه الشاشة. آمل أن يكون هذا سوف تساعدك وجميع! :)





android-orientation