ViewPager+Fragment+NumberPicker显示的问题

来源:互联网 发布:php 格式化百分比 编辑:程序博客网 时间:2024/06/05 09:48

问题描述:在ViewPager+Fragment的结构中,某个Fragment(暂且称之为fragmentC)中有多个NumberPicker,当ViewPager由fragmentC切换到其他fragment时,fragmentC会被销毁(并非完全销毁,有些值还在,原理还不太清楚),当再次切回fragmenC时,会重新执行它的onCreateView方法,重新初始化里面的控件,但是这时,NumberPicker显示的数值全部变成了一样的(后来发现全部变成了最后一个的值),调用NumberPicker的getValue()发现它们真实的值是正确的,显示的却不对,很奇怪。如下图

      

左边是第一次切换到画面,右边是第二次进来,NumberPicker显示异常,查看了NumberPicker的源代码,发现它是由两份ImageButton和一个EditText组成的,于是在下面同样写了一行EditText,结果EditText显示正常。实在是找不出原因,于是自己写了一个自定义的NumberPicker,两个ImageButton加中间的value部分用TextView实现,结果就没问题了。

代码如下:

package com.example.ppp;import android.content.Context;import android.util.AttributeSet;import android.view.LayoutInflater;import android.view.View;import android.widget.ImageButton;import android.widget.LinearLayout;import android.widget.TextView;import com.example.viewpager.R;public class CustomNumberPicker extends LinearLayout {/** * The increment button. */private ImageButton mIncrementButton;/** * The decrement button. */private ImageButton mDecrementButton;/** * The text for showing the current value. */private TextView mValueText;/** * The height of the text. */private int mTextSize = 12;private int mMinValue;private int mMaxValue;/** * Listener to be notified upon current value change. */private CustomOnValueChangeListener mOnValueChangeListener;private int mValue;public interface CustomOnValueChangeListener {void onValueChange(CustomNumberPicker picker, int previous, int mValue);};public CustomNumberPicker(Context context, AttributeSet attrs) {super(context, attrs);LayoutInflater.from(context).inflate(R.layout.view_number_picker, this,true);mValueText = (TextView) findViewById(R.id.view_number_picker_text_value);mIncrementButton = (ImageButton) findViewById(R.id.view_number_picker_btn_increment);mDecrementButton = (ImageButton) findViewById(R.id.view_number_picker_btn_decrement);mIncrementButton.setOnClickListener(onClickListener);mDecrementButton.setOnClickListener(onClickListener);}OnClickListener onClickListener = new OnClickListener() {public void onClick(View v) {mValueText.clearFocus();if (v.getId() == R.id.view_number_picker_btn_increment) {changeCurrentByOne(true);} else {changeCurrentByOne(false);}}};protected void changeCurrentByOne(boolean increment) {if (increment) {changeCurrent(mValue + 1);} else {changeCurrent(mValue - 1);}}private void changeCurrent(int current) {if (mValue == current) {return;}int previous = mValue;setValue(current);notifyChange(previous, current);}public void setValue(int value) {if (mValue == value) {return;}if (value < mMinValue) {value = mMaxValue;}if (value > mMaxValue) {value = mMinValue;}mValue = value;updateInputTextView();}private void updateInputTextView() {mValueText.setText(String.valueOf(mValue));}private void notifyChange(int previous, int current) {if (mOnValueChangeListener != null) {mOnValueChangeListener.onValueChange(this, previous, mValue);}}public CustomOnValueChangeListener getOnValueChangeListener() {return mOnValueChangeListener;}public void setOnValueChangeListener(CustomOnValueChangeListener mOnValueChangeListener) {this.mOnValueChangeListener = mOnValueChangeListener;}public int getMinValue() {return mMinValue;}public void setMinValue(int mMinValue) {this.mMinValue = mMinValue;}public int getMaxValue() {return mMaxValue;}public void setMaxValue(int mMaxValue) {this.mMaxValue = mMaxValue;}public int getTextSize() {return mTextSize;}public void setTextSize(int size) {this.mTextSize = size;mValueText.setTextSize(size);}public int getValue() {return mValue;}}
view_number_picker.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="40dip"    android:layout_height="90dip"    android:orientation="vertical" >    <ImageButton        android:id="@+id/view_number_picker_btn_increment"        android:layout_width="match_parent"        android:layout_height="0dip"        android:layout_weight="1"        android:background="@drawable/btn_increment_bg" />    <TextView        android:id="@+id/view_number_picker_text_value"        android:layout_width="match_parent"        android:layout_height="0dip"        android:layout_weight="1"        android:background="@drawable/value_bg"        android:gravity="center"        android:text="12"        android:textColor="#000000"        android:textSize="16sp" />    <ImageButton        android:id="@+id/view_number_picker_btn_decrement"        android:layout_width="match_parent"        android:layout_height="0dip"        android:layout_weight="1"        android:background="@drawable/btn_decrement_bg" /></LinearLayout>

虽然问题解决了,但是还是不知道为什么。

0 0
原创粉丝点击