2014-11-19 5 views
1

Я пытаюсь сделать пользовательский просмотр, но у меня проблема с счетчиком. Когда я запускаю приложение, все в порядке. Предпочтения читаются, а метод spinner setSelection работает отлично (изображение в порядке). Когда я изменяю значение счетчика, тоже нет проблем: настройки сохранены, и когда я запускаю приложение, отображается новый выбор.Инициализация счетчика в пользовательском представлении

Проблема возникает при повороте устройства, все значение моего счетчика сбрасывается до последнего значения счетчика (vv2 в моем коде). Я действительно не понимаю ...

before rotating device

after rotating device

Вот мой код:

widget_value_view.xml

<?xml version="1.0" encoding="utf-8"?> 
<merge xmlns:android="http://schemas.android.com/apk/res/android" > 
    <Spinner 
     android:id="@+id/my_spinner" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerVertical="true" 
     android:background="@android:color/transparent" /> 

    <TextView 
     android:id="@+id/my_value_tv" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="15dp" 
     android:layout_centerVertical="true" 
     android:background="@android:color/transparent" /> 
</merge> 

Класс ValueView.java:

package com.example.spinnertest; 
import java.util.Arrays; 
import java.util.List; 
import android.content.Context; 
import android.content.res.TypedArray; 
import android.util.AttributeSet; 
import android.view.Gravity; 
import android.view.LayoutInflater; 
import android.widget.LinearLayout; 
import android.widget.Spinner; 
import android.widget.TextView; 

public class ValueView extends LinearLayout { 

    protected TextView mValueTv = null; 
    protected Spinner mSpinner = null; 
    protected List<String> mChoiceList; 

    private MySpinnerAdapter mSpinnerAdapter; 

    public ValueView(Context context) { 
     super(context); 
    } 

    public ValueView(Context context, AttributeSet attributes){ 
     super(context,attributes); 

     TypedArray a = context.getTheme().obtainStyledAttributes(attributes,R.styleable.ValueView,0, 0); 
     try { 
      String valueList = a.getString(R.styleable.ValueView_valueList); 
      mChoiceList = Arrays.asList(valueList.split("\\|")); 
     } finally { 
      a.recycle(); 
     } 

     setOrientation(LinearLayout.HORIZONTAL); 
     setGravity(Gravity.CENTER_VERTICAL); 

     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     inflater.inflate(R.layout.widget_value_view, this, true); 

     mSpinner = (Spinner) getChildAt(0); 
     mValueTv = (TextView) getChildAt(1); 

     mSpinnerAdapter = new MySpinnerAdapter(context, mChoiceList); 
     mSpinner.setAdapter(mSpinnerAdapter); 
    } 

    /** 
    * Change textview value 
    */ 
    public void setValue(double value,String format){ 
     mValueTv.setText("todo"); 
     invalidate(); 
     requestLayout(); 
    } 

    /** 
    * Set the current item of the spinner 
    * @param position of the item 
    */ 
    public void setSelection(int position, boolean animate) { 
     // mSpinnerAdapter.notifyDataSetChanged(); 
     mSpinner.setSelection(position,animate); 
     // invalidate(); 
     // requestLayout(); 
    } 

    public int getSelectedItemPosition() { 
     return mSpinner.getSelectedItemPosition(); 
    } 

} 

В этом классе я использую адаптер определить с 2 макета и один класс: MySpinnerAdapter.java

package com.example.spinnertest; 

import java.util.List; 
import android.content.Context; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class MySpinnerAdapter extends BaseAdapter { 

    public static final String ITEM_ALTITUDE = "altitude"; 
    public static final String ITEM_SPEED = "speed"; 
    public static final String ITEM_DISTANCE = "distance"; 
    private static final String LOG_TAG = "SPINNER_TEST"; 

    private Context mContext; 
    private List<String> mChoiceList; 

    public MySpinnerAdapter(Context context, List<String> values) { 
     this.mContext = context; 
     this.mChoiceList = values; 
    } 

    @Override 
    public int getCount() { 
     return mChoiceList.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return mChoiceList.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      LayoutInflater layout = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = layout.inflate(R.layout.item_spinner_value, null); 
     } 
     ImageView imView = (ImageView) convertView.findViewById(R.id.item_spinner_value_iv); 
     Log.d(LOG_TAG,"Spinner Adapter position = " + String.valueOf(position)); 
     imView.setImageResource(getSpinnerItemImage(position)); 
     return convertView; 
    } 

    @Override 
    public View getDropDownView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      LayoutInflater layout = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = layout.inflate(R.layout.item_spinner_list, null); 
     } 
     ImageView imView = (ImageView) convertView.findViewById(R.id.item_spinner_list_iv); 
     TextView textView = (TextView) convertView.findViewById(R.id.item_spinner_list_tv); 
     textView.setText(mChoiceList.get(position)); 
     imView.setImageResource(getSpinnerItemImageSmall(position)); 
     return convertView; 
    } 

    private int getSpinnerItemImageSmall(int position) { 
     String item = mChoiceList.get(position); 
     if (item.equals(ITEM_ALTITUDE)) { 
      return R.drawable.altitude_small; 
     } else if (item.equals(ITEM_DISTANCE)) { 
      return R.drawable.distance_small; 
     } else if (item.equals(ITEM_SPEED)) { 
      return R.drawable.vitesse_small; 
     } else { 
      return R.drawable.date_small; 
     } 
    } 

    private int getSpinnerItemImage(int position) { 
     String item = mChoiceList.get(position); 
     if (item.equals(ITEM_ALTITUDE)) { 
      return R.drawable.altitude; 
     } else if (item.equals(ITEM_DISTANCE)) { 
      return R.drawable.distance; 
     } else if (item.equals(ITEM_SPEED)) { 
      return R.drawable.vitesse; 
     } else { 
      return R.drawable.date; 
     } 
    } 
} 

и 2 макета item_spinner_list.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <ImageView 
     android:id="@+id/item_spinner_list_iv" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerVertical="true" 
     android:padding="5dp" 
     android:src="@android:drawable/ic_menu_gallery" /> 

    <TextView 
     android:id="@+id/item_spinner_list_tv" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerVertical="true" 
     android:padding="5dp" 
     android:layout_toRightOf="@+id/item_spinner_list_iv" 
     android:text="Durée" /> 

</RelativeLayout> 

и item_spinner_value.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@android:color/transparent" > 

    <ImageView 
     android:id="@+id/item_spinner_value_iv" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerVertical="true" 
     android:padding="5dp" 
     android:src="@android:drawable/ic_menu_gallery" /> 
</RelativeLayout> 

и, наконец, моя MainActivity.java

package com.example.spinnertest; 

import android.app.Activity; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.preference.PreferenceManager; 

public class MainActivity extends Activity { 

    private SharedPreferences mPref; 
    private ValueView mVv1; 
    private ValueView mVv2; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 

     mVv1 = (ValueView)findViewById(R.id.value1); 
     mVv2 = (ValueView)findViewById(R.id.value2); 

     mVv1.setSelection(mPref.getInt("pref_val1", 0),false); 
     mVv2.setSelection(mPref.getInt("pref_val2", 1),false); 
    } 

    @Override 
    public void onPause() { 
     SharedPreferences.Editor editor = mPref.edit(); 
     editor.putInt("pref_val1", mVv1.getSelectedItemPosition()); 
     editor.putInt("pref_val2", mVv2.getSelectedItemPosition()); 
     editor.commit(); 
     super.onPause(); 
    } 
} 

и расположение:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:custom="http://schemas.android.com/apk/res/com.example.spinnertest" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <com.example.spinnertest.ValueView 
     android:id="@+id/value1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_margin="10dp" 
     android:background="@android:color/transparent" 
     custom:valueList="speed|altitude|distance" /> 

    <com.example.spinnertest.ValueView 
     android:id="@+id/value2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/value1" 
     android:layout_margin="10dp" 
     custom:valueList="speed|altitude|distance" /> 

</RelativeLayout> 
+0

Попробуйте добавить 'андроида: configChanges =«ориентацию»' в вашей 'деятельности manifest' –

+0

добавить' андроида: configChanges = «ориентацию» 'в манифесте, но не работает. – Fred

ответ

0

Я не могу объяснить, почему ваш код не работает, но я бы предпочел, чтобы сохранить состояние блесны локально (я имею в виду деятельности); это обычный рабочий процесс Android для поворота экрана.

Что-то вроде этого:

String MVV1="1"; 
String MVV2="2"; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    setContentView(R.layout.activity_main); 

    mPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 

    mVv1 = (ValueView)findViewById(R.id.value1); 
    mVv2 = (ValueView)findViewById(R.id.value2); 

if (savedInstanceState != null) { 
    mVv1.setSelection(savedInstanceState.getInt(MVV1),false); 
    mVv2.setSelection(savedInstanceState.getInt(MVV2),false); 
} 
else{ 
    mVv1.setSelection(mPref.getInt("pref_val1", 0),false); 
    mVv2.setSelection(mPref.getInt("pref_val2", 1),false); 
    } 
} 

@Override 
public void onPause() { 
    SharedPreferences.Editor editor = mPref.edit(); 
    editor.putInt("pref_val1", mVv1.getSelectedItemPosition()); 
    editor.putInt("pref_val2", mVv2.getSelectedItemPosition()); 
    editor.commit(); 
    super.onPause(); 
} 

@Override 
protected void onSaveInstanceState (Bundle outState) { 
    super.onSaveInstanceState(outState); 
outState.putInt(MVV1, mVv1.getSelectedItemPosition()); 
outState.putInt(MVV2, mVv2.getSelectedItemPosition()); 
} 

Мой синтаксис может быть не идеально, потому что я написал его в редакторе так, но надеюсь, что у вас появилась идея: состояние записывается в настройках, как только активность приостановлена но если действие вращается (ваш метод должен работать, но, возможно, есть кеш для доступа к предпочтениям или чему-то еще ...), то он будет использовать для него конкретный пакет: тот, который заполняется, только когда экран вращается и используется, когда экран воссоздается.

Test это и сказать, если он работает;)

+0

Спасибо, но он не работает. Я думаю, проблема связана с адаптером spinner, но не может найти причину. – Fred

+0

Хорошо, я не вижу ошибки, я должен смотреть на нее точно; держите вас в курсе :) –

+0

Я не нашел решения для своей проблемы, поэтому я решил сделать это по-другому. Я понимаю, что мне не нужен прядильщик, а просто нужно всплывающее меню.Поэтому я создаю пользовательский вид с кнопкой изображения и текстовым полем для отображения значения. Когда пользователь нажимает на кнопку изображения, появляется всплывающее меню. – Fred

Смежные вопросы