在自定义视图微调初始化(spinner initialization in a custom vie

2019-10-21 07:41发布

我尽量让一个自定义的看法,但我有与微调的问题。 当我启动应用程序一切正常。 首读和整流器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类:

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>

Answer 1:

我真的不能解释为什么你的代码不能正常工作,但我宁愿在本地保存(我指的是在活动)微调的状态; 它是屏幕旋转正常的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());
}

我的语法是也许不是完美的,因为我写的SO编辑器,但希望你有这个想法:状态是尽快写在首选项作为活动暂停,但如果活动旋转(你的方法应该工作,但也许是有高速缓存访​​问喜好什么的...),那么,它会使用它的具体包:这是充满了屏幕旋转只是当,当屏幕被重新使用的方法。

测试,并说,如果它的工作;)



文章来源: spinner initialization in a custom view