2014-11-19 5 views
1

사용자 정의보기를 만들려고했지만 회 전자에 문제가 있습니다. 응용 프로그램을 시작하면 모든 것이 정상입니다. 기본 설정을 읽었으며 회 전자 setSelection 방법이 훌륭하게 작동합니다 (디스플레이 그림은 정상입니다). 스피너 값을 변경하면 아무런 문제가 없습니다. 환경 설정이 저장되고 응용 프로그램을 시작할 때 새로운 선택 사항이 표시됩니다.사용자 정의보기에서 회 전자 초기화

장치를 회전 할 때 내 스피너 값이 마지막 회 전자 값 (내 코드의 vv2)으로 재설정됩니다.

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 클래스 :

정말 여기

after rotating device

before rotating device

내 코드입니다 ... 이해하지 않는다
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(); 
    } 

} 
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 : 나는 어댑터를 사용하여이 클래스에서

2 레이아웃과 하나 개의 클래스로 정의

<?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 = "방향을"'당신'활동에 내가 안드로이드'추가 –

+0

을 manifest' : configChanges = "방향"'매니페스트에 있지만, 작동하지 않습니다. – Fred

답변

0

난 정말 설명 할 수 없다,하지만 난 (내가 활동에서 의미) 로컬 회 전자의 상태를 저장하는 것을 선호; 그것은 화면 회전을위한 일반적인 안드로이드 워크 플로우입니다. 이 같은

뭔가 : 상태가 즉시 활동이 일시 정지로 환경 설정에서 기록 : 나는 SO 편집기에서 쓴하지만 당신은 생각이있어 희망 때문에

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()); 
} 

내 구문은 아마도 완벽하지 않습니다 하지만 액티비티가 회전한다면 (당신의 메소드는 작동하지만 어쩌면 환경 설정이나 뭔가에 접근하기위한 캐시가있을 것입니다 ...), 그 다음에 특정 번들을 사용할 것입니다 : 화면이 회전 할 때 채워지는 것 화면을 다시 만들 때 사용됩니다. 이 일하고 경우와 말

시험)

+0

감사하지만 작동하지 않습니다. 문제는 회 전자 어댑터에서 발생한다고 생각하지만 이유를 찾을 수 없습니다. – Fred

+0

좋아, 나는 오류를 볼 수 없다, 나는 그것을 정확하게보아야한다; 당신이 업데이 트 유지 :) –

+0

내 문제에 대한 해결책을 찾지 못했습니다 그래서 다르게 할 결심. 나는 회 전자가 필요 없지만 팝업 메뉴가 필요하다는 것을 알고 있습니다.그래서 이미지 버튼과 텍스트 필드를 가진 커스텀 뷰를 만들어 값을 표시합니다. 사용자가 이미지 버튼을 클릭하면 팝업 메뉴가 나타납니다. – Fred