一、摘要
Android项目结构无非是res和src这两个文件夹,src主要Java代码,res放置资源文件,Eclipse默认生成的资源文件包括:drawable、layout、values、menu,关于还可以存放哪个类型的资源文件呢?打开SDK路径下的platforms文件夹,随便打开一个平台,比如:android-23,如下路径——“E:\adt-bundle-windows-x86_64-20140702\sdk\platforms\android-23\data\res”,找到res文件夹,这里展示所有该平台开发需要的资源。
二、分析res结构
在打开的res文件夹下,看到了其他在Eclipse创建项目时无法自动生成的anim、animator、color文件夹,这些文件夹在实际的项目开发中可以手动添加,存放的内容和系统提供的内容类型一样,于是我们可以在自己项目的res中重写。
如何重写系统的默认属性?举一个例子:重写Spinner控件的默认样式和下拉选项样式。
上面我们讲解了Android项目结构,了解每个res下属文件夹的作用,那样我们修改起来显得很方便了。上面例子想要修改Spinner样式,重写android:background=""属性可以完成,这里需要注意的是,添加什么样的属性值合适呢?
如果你不清楚怎么添加属性值,添加什么样的属性值合适,可以打开源码下的Spinner控件默认属性android:background=""属性值添加方式(需要说明的系统所有控件样式定义在Style.xml文件,组件样式定义在Themes.xml,控件属性定义在attrs.xml),EditPlus(下载)打开style.xml文件,Ctrl+F找到Spinner控件,如下图:
看到选项:
可以看到该文件是一个selector选择器,在drawabl-xhdpi.xml文件夹指定背景:btn_dropdown_normal.png,背景是一张.9图片,如下图:
根据Spinner控件状态选择不同背景,我们要做的是:复制该文件到自己项目res/drawable中,修改各状态的背景样式(重写属性值),和美工商量定制一张自己“梦想”的背景:btn_dropdown_normal.png,最后引用定制的背景即可(这里使用blue_bg.9.png代替btn_dropdown_pressed.9.png),运行效果如下图:
重写Spinner默认字体颜色
在Spinner中未提供android:textColor=""属性,就好像ListView一样,提供适配器指定布局、内容的方式修改字体颜色,Spinner和ListView不同的是:Spinner有下拉选项布局和默认布局,
ArrayAdapter绑定数据的代码如下:
- /**第一种添加数据的方式
- * @return ArrayAdapter对象
- */
- private ArrayAdapter<String> setArrayAdapter() {
- // 建立数据源
- String[] mItems = getResources().getStringArray(R.array.citys);
- // 建立Adapter并且绑定数据源
- ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
- R.layout.simple_spinner_item, mItems);
- adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- return adapter;
- }
BaseAdapter绑定数据的代码如下:
- /**第二种添加数据的方式
- * @return BaseAdapter对象
- */
- private BaseAdapter setBaseAdapter() {
- CityBean city = new CityBean();
- city.setCity("北京");
- mList.add(city);
- CityBean city2 = new CityBean();
- city2.setCity("上海");
- mList.add(city2);
- CityBean city3 = new CityBean();
- city3.setCity("广州");
- mList.add(city3);
- CityBean city4 = new CityBean();
- city4.setCity("深圳");
- mList.add(city4);
- MyBaseAdapter adapter = new MyBaseAdapter(this, mList);
- return adapter;
- }
- package cn.teachcourse.adapter;
- import java.util.List;
- import android.content.Context;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.BaseAdapter;
- import android.widget.TextView;
- import cn.teachcourse.bean.CityBean;
- import cn.teachcourse.main.R;
- /*
- @author TeachCourse
- @date 创建于:2015-12-14
- */
- public class MyBaseAdapter extends BaseAdapter {
- private Context context;
- private List<CityBean> mList;
- public MyBaseAdapter(Context context,List<CityBean> mList) {
- this.context=context;
- this.mList=mList;
- }
- @Override
- public int getCount() {
- if(mList!=null){
- return mList.size();
- }
- return 0;
- }
- @Override
- public Object getItem(int position) {
- if(mList!=null){
- return mList.get(position);
- }
- return null;
- }
- @Override
- public long getItemId(int position) {
- return position;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- ViewHolder mViewHolder;
- if(convertView==null){//初始化convertView
- LayoutInflater mInflater=LayoutInflater.from(context);
- convertView=mInflater.inflate(R.layout.simple_spinner_item, parent,false);
- mViewHolder=new ViewHolder();
- mViewHolder.mTextView=(TextView) convertView.findViewById(R.id.text1);
- convertView.setTag(mViewHolder);
- }else{
- mViewHolder=(ViewHolder) convertView.getTag();
- }
- mViewHolder.mTextView.setText(mList.get(position).getCity());
- return convertView;
- }
- static class ViewHolder{
- TextView mTextView;
- }
- }
SpinnerAdapter绑定数据的代码如下:
- package cn.teachcourse.adapter;
- import java.util.List;
- import cn.teachcourse.adapter.MyBaseAdapter.ViewHolder;
- import cn.teachcourse.bean.CityBean;
- import cn.teachcourse.main.R;
- import android.content.Context;
- import android.database.DataSetObserver;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.CheckedTextView;
- import android.widget.SpinnerAdapter;
- import android.widget.TextView;
- /*
- @author TeachCourse
- @date 创建于:2015-12-14
- */
- public class MySpinnerAdapter implements SpinnerAdapter {
- private Context context;
- private List<CityBean> mList;
- public MySpinnerAdapter(Context context, List<CityBean> mList) {
- this.context = context;
- this.mList = mList;
- }
- @Override
- public void registerDataSetObserver(DataSetObserver observer) {
- // TODO Auto-generated method stub
- }
- @Override
- public void unregisterDataSetObserver(DataSetObserver observer) {
- // TODO Auto-generated method stub
- }
- @Override
- public int getCount() {
- if(mList!=null){
- return mList.size();
- }
- return 0;
- }
- @Override
- public Object getItem(int position) {
- if(mList!=null){
- return mList.get(position);
- }
- return null;
- }
- @Override
- public long getItemId(int position) {
- if(mList!=null){
- return position;
- }
- return 0;
- }
- @Override
- public boolean hasStableIds() {
- // TODO Auto-generated method stub
- return false;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- ViewHolder mViewHolder;
- if(convertView==null){//初始化convertView
- LayoutInflater mInflater=LayoutInflater.from(context);
- convertView=mInflater.inflate(R.layout.simple_spinner_item, parent,false);
- mViewHolder=new ViewHolder();
- mViewHolder.mTextView=(TextView) convertView.findViewById(R.id.text1);
- convertView.setTag(mViewHolder);
- }else{
- mViewHolder=(ViewHolder) convertView.getTag();
- }
- mViewHolder.mTextView.setText(mList.get(position).getCity());
- return convertView;
- }
- static class ViewHolder{
- TextView mTextView;
- }
- @Override
- public int getItemViewType(int position) {
- // TODO Auto-generated method stub
- return 0;
- }
- @Override
- public int getViewTypeCount() {
- // TODO Auto-generated method stub
- return 0;
- }
- @Override
- public boolean isEmpty() {
- // TODO Auto-generated method stub
- return false;
- }
- @Override
- public View getDropDownView(int position, View convertView, ViewGroup parent) {
- LayoutInflater inflate=LayoutInflater.from(context);
- View view =inflate.inflate(R.layout.simple_spinner_dropdown_item, parent, false);
- CheckedTextView checked=(CheckedTextView)view.findViewById(R.id.dropdown_item_id);
- checked.setText(mList.get(position).getCity());
- return view;
- }
- }
区别:
ArrayAdapter和SpinnerAdapter绑定数据的方式可以手动定义Spinner下拉列表样式和默认样式:ArrayAdapter使用setDropDownViewResource(int)方法,SpinnerAdapter使用回调方法getDropDownView(),如上面代码。
BaseAdapter只可以手动定义默认样式(暂不清楚怎么设置下拉列表),但BaseAdapter使用方法和SpinnerAdapter一样,推荐使用SpinnerAdapter。
修改Spinner控件颜色、样式和调整大小都不是啥事,只需要定义simple_spinner_item.xml布局和simple_spinner_dropdown_item.xml即可
你可能感兴趣的文章
转载请注明出处: https://www.teachcourse.cn/1704.html ,谢谢支持!