我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android自定义可循环的滚动选择器CycleWheelView

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android自定义可循环的滚动选择器CycleWheelView

最近碰到个项目要使用到滚动选择器,原生的NumberPicker可定制性太差,不大符合UI要求。
网上开源的WheelView是用ScrollView写的,不能循环滚动,而且当数据量很大时要加载的Item太多,性能非常低。
然后,还是自己写一个比较靠谱,用的是ListView实现的。写完自己体验了一下,性能不错,再大的数据也不怕了。
感觉不错,重新封装了一下,提供了一些接口可以直接按照自己的需求定制,调用方法在MainActivity中。
补个图片: 

不多说了,直接上代码:

CycleWheelView.java:



package com.example.wheelviewdemo;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;

public class CycleWheelView extends ListView {
 public static final String TAG = CycleWheelView.class.getSimpleName();
 private static final int COLOR_DIVIDER_DEFALUT = Color.parseColor("#747474");
 private static final int HEIGHT_DIVIDER_DEFAULT = 2;
 private static final int COLOR_SOLID_DEFAULT = Color.parseColor("#3e4043");
 private static final int COLOR_SOLID_SELET_DEFAULT = Color.parseColor("#323335");
 private static final int WHEEL_SIZE_DEFAULT = 3;
 private Handler mHandler;
 private CycleWheelViewAdapter mAdapter;
 
 private List<String> mLabels;
 
 private int mLabelSelectColor = Color.WHITE;
 
 private int mLabelColor = Color.GRAY;
 
 private float mAlphaGradual = 0.7f;
 
 private int dividerColor = COLOR_DIVIDER_DEFALUT;
 
 private int dividerHeight = HEIGHT_DIVIDER_DEFAULT;
 
 private int seletedSolidColor = COLOR_SOLID_SELET_DEFAULT;
 
 private int solidColor = COLOR_SOLID_DEFAULT;
 
 private int mWheelSize = WHEEL_SIZE_DEFAULT;
 
 private int mItemLayoutId;
 
 private int mItemLabelTvId;
 
 private int mItemHeight;
 private boolean cylceEnable;
 private int mCurrentPositon;
 private WheelItemSelectedListener mItemSelectedListener;
 public CycleWheelView(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
 }
 public CycleWheelView(Context context, AttributeSet attrs) {
  super(context, attrs);
  init();
 }
 public CycleWheelView(Context context) {
  super(context);
 }
 private void init() {
  mHandler = new Handler();
  mItemLayoutId = R.layout.item_cyclewheel;
  mItemLabelTvId = R.id.tv_label_item_wheel;
  mAdapter = new CycleWheelViewAdapter();
  setVerticalScrollBarEnabled(false);
  setScrollingCacheEnabled(false);
  setCacheColorHint(Color.TRANSPARENT);
  setFadingEdgeLength(0);
  setOverScrollMode(OVER_SCROLL_NEVER);
  setDividerHeight(0);
  setAdapter(mAdapter);
  setOnScrollListener(new OnScrollListener() {
   @Override
   public void onScrollStateChanged(AbsListView view, int scrollState) {
    if (scrollState == SCROLL_STATE_IDLE) {
     View itemView = getChildAt(0);
     if (itemView != null) {
      float deltaY = itemView.getY();
      if (deltaY == 0) {
       return;
      }
      if (Math.abs(deltaY) < mItemHeight / 2) {
       smoothScrollBy(getDistance(deltaY), 50);
      } else {
       smoothScrollBy(getDistance(mItemHeight + deltaY), 50);
      }
     }
    }
   }
   @Override
   public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
     int totalItemCount) {
    refreshItems();
   }
  });
 }
 private int getDistance(float scrollDistance) {
  if (Math.abs(scrollDistance) <= 2) {
   return (int) scrollDistance;
  } else if (Math.abs(scrollDistance) < 12) {
   return scrollDistance > 0 ? 2 : -2;
  } else {
   return (int) (scrollDistance / 6);
  }
 }
 private void refreshItems() {
  int offset = mWheelSize / 2;
  int firstPosition = getFirstVisiblePosition();
  int position = 0;
  if (getChildAt(0) == null) {
   return;
  }
  if (Math.abs(getChildAt(0).getY()) <= mItemHeight / 2) {
   position = firstPosition + offset;
  } else {
   position = firstPosition + offset + 1;
  }
  if (position == mCurrentPositon) {
   return;
  }
  mCurrentPositon = position;
  if (mItemSelectedListener != null) {
   mItemSelectedListener.onItemSelected(getSelection(), getSelectLabel());
  }
  resetItems(firstPosition, position, offset);
 }
 private void resetItems(int firstPosition, int position, int offset){
  for (int i = position - offset - 1; i < position + offset + 1; i++) {
   View itemView = getChildAt(i - firstPosition);
   if (itemView == null) {
    continue;
   }
   TextView labelTv = (TextView) itemView.findViewById(mItemLabelTvId);
   if (position == i) {
    labelTv.setTextColor(mLabelSelectColor);
    itemView.setAlpha(1f);
   } else {
    labelTv.setTextColor(mLabelColor);
    int delta = Math.abs(i - position);
    double alpha = Math.pow(mAlphaGradual, delta);
    itemView.setAlpha((float) alpha);
   }
  }
 }
 
 public void setLabels(List<String> labels) {
  mLabels = labels;
  mAdapter.setData(mLabels);
  mAdapter.notifyDataSetChanged();
  initView();
 }
 
 public void setOnWheelItemSelectedListener(WheelItemSelectedListener mItemSelectedListener) {
  this.mItemSelectedListener = mItemSelectedListener;
 }
 
 public List<String> getLabels() {
  return mLabels;
 }
 
 public void setCycleEnable(boolean enable) {
  if (cylceEnable != enable) {
   cylceEnable = enable;
   mAdapter.notifyDataSetChanged();
   setSelection(getSelection());
  }
 }
 
 @Override
 public void setSelection(final int position) {
  mHandler.post(new Runnable() {
   @Override
   public void run() {
    CycleWheelView.super.setSelection(getPosition(position));
   }
  });
 }
 private int getPosition(int positon) {
  if (mLabels == null || mLabels.size() == 0) {
   return 0;
  }
  if (cylceEnable) {
   int d = Integer.MAX_VALUE / 2 / mLabels.size();
   return positon + d * mLabels.size();
  }
  return positon;
 }
 
 public int getSelection() {
  if (mCurrentPositon == 0) {
   mCurrentPositon = mWheelSize / 2;
  }
  return (mCurrentPositon - mWheelSize / 2) % mLabels.size();
 }
 
 public String getSelectLabel() {
  int position = getSelection();
  position = position < 0 ? 0 : position;
  try {
   return mLabels.get(position);
  } catch (Exception e) {
   return "";
  }
 }
 
 public void setWheelItemLayout(int itemResId, int labelTvId) {
  mItemLayoutId = itemResId;
  mItemLabelTvId = labelTvId;
  mAdapter = new CycleWheelViewAdapter();
  mAdapter.setData(mLabels);
  setAdapter(mAdapter);
  initView();
 }
 
 public void setLabelColor(int labelColor) {
  this.mLabelColor = labelColor;
  resetItems(getFirstVisiblePosition(), mCurrentPositon, mWheelSize/2);
 }
 
 public void setLabelSelectColor(int labelSelectColor) {
  this.mLabelSelectColor = labelSelectColor;
  resetItems(getFirstVisiblePosition(), mCurrentPositon, mWheelSize/2);
 }
 
 public void setAlphaGradual(float alphaGradual) {
  this.mAlphaGradual = alphaGradual;
  resetItems(getFirstVisiblePosition(), mCurrentPositon, mWheelSize/2);
 }
 
 public void setWheelSize(int wheelSize) throws CycleWheelViewException {
  if (wheelSize < 3 || wheelSize % 2 != 1) {
   throw new CycleWheelViewException("Wheel Size Error , Must Be 3,5,7,9...");
  } else {
   mWheelSize = wheelSize;
   initView();
  }
 }
 
 public void setSolid(int unselectedSolidColor, int selectedSolidColor){
  this.solidColor = unselectedSolidColor;
  this.seletedSolidColor = selectedSolidColor;
  initView();
 }
 
 public void setDivider(int dividerColor, int dividerHeight){
  this.dividerColor = dividerColor;
  this.dividerHeight = dividerHeight;
 }
 @SuppressWarnings("deprecation")
 private void initView() {
  mItemHeight = measureHeight();
  ViewGroup.LayoutParams lp = getLayoutParams();
  lp.height = mItemHeight * mWheelSize;
  mAdapter.setData(mLabels);
  mAdapter.notifyDataSetChanged();
  Drawable backgroud = new Drawable() {
   @Override
   public void draw(Canvas canvas) {
    int viewWidth = getWidth();
    Paint dividerPaint = new Paint();
    dividerPaint.setColor(dividerColor);
    dividerPaint.setStrokeWidth(dividerHeight);
    Paint seletedSolidPaint = new Paint();
    seletedSolidPaint.setColor(seletedSolidColor);
    Paint solidPaint = new Paint();
    solidPaint.setColor(solidColor);
    canvas.drawRect(0, 0, viewWidth, mItemHeight * (mWheelSize / 2), solidPaint);
    canvas.drawRect(0, mItemHeight * (mWheelSize / 2 + 1), viewWidth, mItemHeight
      * (mWheelSize), solidPaint);
    canvas.drawRect(0, mItemHeight * (mWheelSize / 2), viewWidth, mItemHeight
      * (mWheelSize / 2 + 1), seletedSolidPaint);
    canvas.drawLine(0, mItemHeight * (mWheelSize / 2), viewWidth, mItemHeight
      * (mWheelSize / 2), dividerPaint);
    canvas.drawLine(0, mItemHeight * (mWheelSize / 2 + 1), viewWidth, mItemHeight
      * (mWheelSize / 2 + 1), dividerPaint);
   }
   @Override
   public void setAlpha(int alpha) {
   }
   @Override
   public void setColorFilter(ColorFilter cf) {
   }
   @Override
   public int getOpacity() {
    return 0;
   }
  };
  setBackgroundDrawable(backgroud);
 }
 private int measureHeight() {
  View itemView = LayoutInflater.from(getContext()).inflate(mItemLayoutId, null);
  itemView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
    ViewGroup.LayoutParams.WRAP_CONTENT));
  int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
  int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
  itemView.measure(w, h);
  int height = itemView.getMeasuredHeight();
  // int width = view.getMeasuredWidth();
  return height;
 }
 public interface WheelItemSelectedListener {
  public void onItemSelected(int position, String label);
 }
 public class CycleWheelViewException extends Exception {
  private static final long serialVersionUID = 1L;
  public CycleWheelViewException(String detailMessage) {
   super(detailMessage);
  }
 }
 public class CycleWheelViewAdapter extends BaseAdapter {
  private List<String> mData = new ArrayList<String>();
  public void setData(List<String> mWheelLabels) {
   mData.clear();
   mData.addAll(mWheelLabels);
  }
  @Override
  public int getCount() {
   if (cylceEnable) {
    return Integer.MAX_VALUE;
   }
   return mData.size() + mWheelSize - 1;
  }
  @Override
  public Object getItem(int position) {
   return "";
  }
  @Override
  public long getItemId(int position) {
   return position;
  }
  @Override
  public boolean isEnabled(int position) {
   return false;
  }
  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
   if (convertView == null) {
    convertView = LayoutInflater.from(getContext()).inflate(mItemLayoutId, null);
   }
   TextView textView = (TextView) convertView.findViewById(mItemLabelTvId);
   if (position < mWheelSize / 2
     || (!cylceEnable && position >= mData.size() + mWheelSize / 2)) {
    textView.setText("");
    convertView.setVisibility(View.INVISIBLE);
   } else {
    textView.setText(mData.get((position - mWheelSize / 2) % mData.size()));
    convertView.setVisibility(View.VISIBLE);
   }
   return convertView;
  }
 }
}
 

MainActivity.java: 


public class MainActivity extends Activity {
 private CycleWheelView cycleWheelView0,cycleWheelView1, cycleWheelView2;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  cycleWheelView0 = (CycleWheelView) findViewById(R.id.cycleWheelView);
  List<String> labels = new ArrayList<>();
  for (int i = 0; i < 12; i++) {
   labels.add("" + i);
  }
  cycleWheelView0.setLabels(labels);
  cycleWheelView0.setAlphaGradual(0.5f);
  cycleWheelView0.setOnWheelItemSelectedListener(new WheelItemSelectedListener() {
   @Override
   public void onItemSelected(int position, String label) {
    Log.d("test", label);
   }
  });
  cycleWheelView1 = (CycleWheelView) findViewById(R.id.cycleWheelView1);
  List<String> labels1 = new ArrayList<>();
  for (int i = 0; i < 24; i++) {
   labels1.add("" + i);
  }
  cycleWheelView1.setLabels(labels1);
  try {
   cycleWheelView1.setWheelSize(5);
  } catch (CycleWheelViewException e) {
   e.printStackTrace();
  }
  cycleWheelView1.setSelection(2);
  cycleWheelView1.setWheelItemLayout(R.layout.item_cyclewheel_custom, R.id.tv_label_item_wheel_custom);
  cycleWheelView1.setOnWheelItemSelectedListener(new WheelItemSelectedListener() {
   @Override
   public void onItemSelected(int position, String label) {
    Log.d("test", label);
   }
  });
  cycleWheelView2 = (CycleWheelView) findViewById(R.id.cycleWheelView2);
  List<String> labels2 = new ArrayList<>();
  for (int i = 0; i < 60; i++) {
   labels2.add("" + i);
  }
  cycleWheelView2.setLabels(labels2);
  try {
   cycleWheelView2.setWheelSize(7);
  } catch (CycleWheelViewException e) {
   e.printStackTrace();
  }
  cycleWheelView2.setCycleEnable(true);
  cycleWheelView2.setSelection(30);
  cycleWheelView2.setAlphaGradual(0.6f);
  cycleWheelView2.setDivider(Color.parseColor("#abcdef"), 2);
  cycleWheelView2.setSolid(Color.WHITE,Color.WHITE);
  cycleWheelView2.setLabelColor(Color.BLUE);
  cycleWheelView2.setLabelSelectColor(Color.RED);
  cycleWheelView2.setOnWheelItemSelectedListener(new WheelItemSelectedListener() {
   @Override
   public void onItemSelected(int position, String label) {
    Log.d("test", label);
   }
  });
 }
}

Item_cyclewheel.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="wrap_content"
 android:padding="16dp"
 android:background="@android:color/transparent" >
 <TextView
  android:id="@+id/tv_label_item_wheel"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:textSize="20sp"
  android:singleLine="true"
  android:layout_centerHorizontal="true"
  android:layout_centerVertical="true" />
</RelativeLayout>

Item_cyclewheel_custom.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="wrap_content"
 android:padding="16dp"
 android:background="@android:color/transparent" >
 <TextView
  android:id="@+id/tv_label_item_wheel_custom"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:singleLine="true"
  android:layout_alignParentLeft="true"
  android:layout_centerVertical="true" />
 <ImageView
  android:layout_width="25dp"
  android:layout_height="25dp"
  android:layout_centerVertical="true"
  android:layout_alignParentRight="true"
  android:class="lazy" data-src="@drawable/ic_launcher" />
</RelativeLayout>

activity_main.xml: 


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="horizontal" >
 <com.example.wheelviewdemo.CycleWheelView
  android:id="@+id/cycleWheelView"
  android:layout_width="0dp"
  android:layout_height="wrap_content"
  android:layout_weight="1" >
 </com.example.wheelviewdemo.CycleWheelView>
 <com.example.wheelviewdemo.CycleWheelView
  android:id="@+id/cycleWheelView1"
  android:layout_width="0dp"
  android:layout_height="wrap_content"
  android:layout_weight="1" >
 </com.example.wheelviewdemo.CycleWheelView>
 <com.example.wheelviewdemo.CycleWheelView
  android:id="@+id/cycleWheelView2"
  android:layout_width="0dp"
  android:layout_height="wrap_content"
  android:layout_weight="1" >
 </com.example.wheelviewdemo.CycleWheelView>
</LinearLayout>
您可能感兴趣的文章:Android selector背景选择器的使用详解Android时间选择器、日期选择器实现代码浅谈谈Android 图片选择器android 字体颜色选择器(ColorPicker)介绍Android仿微信照片选择器实现预览查看图片Android开发中实现IOS风格底部选择器(支持时间 日期 自定义)基于android背景选择器selector的用法汇总Android中颜色选择器和改变字体颜色的实例教程Android PickerView滚动选择器的使用方法android自定义滚轴选择器


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android自定义可循环的滚动选择器CycleWheelView

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android自定义可循环的滚动选择器CycleWheelView

最近碰到个项目要使用到滚动选择器,原生的NumberPicker可定制性太差,不大符合UI要求。 网上开源的WheelView是用ScrollView写的,不能循环滚动,而且当数据量很大时要加载的Item太多,性能非常低。 然后,还是自己写
2022-06-06

Android自定义滚动选择器实例代码

Android自定义滚动选择器 实现图片的效果 代码如下package com.linzihui.widget; import android.annotation.SuppressLint; import android.content.
2022-06-06

Android自定义view实现滚动选择控件详解

最近在开发中需要实现滚动进行类别的选择,也就是我们所说的滚动选择器,这里我们自定义来实现这个功能,这篇文章主要介绍了Android自定义view实现滚动选择控件
2022-11-13

微信小程序怎么自定义滚动选择器

这篇文章主要介绍“微信小程序怎么自定义滚动选择器”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“微信小程序怎么自定义滚动选择器”文章能帮助大家解决问题。js:// pages/xuanzeqi/xua
2023-07-02

轻松实现可扩展自定义的Android滚轮时间选择控件

项目需求中有个功能模块需要用到时间选择控件,但是android系统自带的太丑了,只能自己优化下,结合WheelView实现滚轮选择日期,好像网上也挺多这种文章的。但是适用范围还是不同,希望这个能够对需求相同的朋友有一定帮助。控件标题还有年月
2022-06-06

Android自定义ViewGroup实现可滚动的横向布局(2)

上一篇文章自定义viewgroup(1)地址://www.jb51.net/article/100608.htm 这里直接代码:package com.example.libingyuan.horizontallistview.Scroll
2022-06-06

Android开发实现自定义水平滚动的容器示例

本文实例讲述了Android开发实现自定义水平滚动的容器。分享给大家供大家参考,具体如下:public class HorizontalScrollView extends ViewGroup { //手势 private Gestur
2023-05-30

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录