2018-11-08 11:47:03 weixin_42137287 阅读数 1090
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    26333 人正在学习 去看看 任苹蜻

很多安卓应用都有日期选择以及下拉列表的功能,具体就是下面图示的效果
在这里插入图片描述在这里插入图片描述在这里插入图片描述
具体代码实现如下
先写布局文件xml,style就不一一列举了,根据自己的需求写就好

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    style="@style/LinearLayout1">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="40dp">
        <TextView
            style="@style/TongjiTitle"
            android:text="添加新账"/>
    </LinearLayout>
    <LinearLayout
        android:layout_marginTop="5dp"
        style="@style/LinearLayout2">
        <TextView
            style="@style/addTextView"
            android:drawableRight="@mipmap/riqi"/>
        <EditText
            android:id="@+id/et_date"
            style="@style/addEditText"/>
        <TextView
            style="@style/addTextView"
            android:drawableRight="@mipmap/kinds"/>
        <Spinner
            android:id="@+id/spinner1"
            style="@style/addEditText"/>
    </LinearLayout>
    <LinearLayout
        android:layout_marginTop="5dp"
        style="@style/LinearLayout2">
        <TextView
            style="@style/addTextView"
            android:drawableRight="@mipmap/money"/>
        <EditText
            android:id="@+id/et_money"
            style="@style/addEditText"/>
        <TextView
            style="@style/addTextView"
            android:drawableRight="@mipmap/text"/>
        <EditText
            android:id="@+id/et_text"
            style="@style/addEditText"/>
    </LinearLayout>
    <LinearLayout
        style="@style/LinearLayout2"
        android:gravity="center">
        <Button
            android:id="@+id/btn_concel"
            style="@style/addButton"
            android:text="取消"/>
        <TextView
            android:layout_width="15dp"
            android:layout_height="60dp" />
        <Button
            android:id="@+id/btn_add"
            style="@style/addButton"
            android:text="确认添加"/>
    </LinearLayout>


</LinearLayout>

接下来是activity具体实现
我是在继承Fragment的类写的,所以写在onCreateView方法里,如果是在继承AppCompatActivity的类中,则直接写在onCreate方法里就好。区别就是onCreateView中的findViewById前需要加上你定义的View,在使用 适配器ArrayAdapter时第一个参数不能用this,而要用getActivity(),这个很重要,我纠结了好久才解决。

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.addfragment, container, false);
        et_date=(EditText)rootView.findViewById(R.id.et_date);
        et_money=(EditText)rootView.findViewById(R.id.et_money);
        et_text=(EditText)rootView.findViewById(R.id.et_text);
        btn_add=(Button)rootView.findViewById(R.id.btn_add);
        btn_cancel=(Button)rootView.findViewById(R.id.btn_concel);
        dbOpenHelper=new MyDBOpenHelper(getActivity().getApplicationContext());
        //设置选择日期
        dateFormatter = new SimpleDateFormat("MM月dd日");//这里可以设置日期的格式,如果是年月日则改为yyyy年MM月dd日
        createDate= Calendar.getInstance();
        createDate.setTimeInMillis(System.currentTimeMillis());
        et_date.setText(dateFormatter.format(new Date(createDate.getTimeInMillis())));//把当前系统日期显示在TextView中,如果需要不显示注释掉即可
        et_date.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new DatePickerDialog(getActivity(), new DatePickerDialog.OnDateSetListener() {
                    @Override
                    public void onDateSet(DatePicker datePicker, int year, int month, int day) {
                        createDate.set(year, month, day);
                        et_date.setText(dateFormatter.format(new Date(createDate.getTimeInMillis())));
                    }
                }, createDate.get(Calendar.YEAR), createDate.get(Calendar.MONTH), createDate.get(Calendar.DAY_OF_MONTH))
                        .show();
            }
        });

        List<String> list = new ArrayList<String>();
        list.add("零花");
        list.add("吃饭");
        list.add("日常");
        list.add("学习");
        list.add("饭卡");
        //第一项也就是显示的为零花,如果不设置初始值,则第一项可直接设置为空list.add("");或者是常用的list.add("请选择类型");
        ArrayAdapter<String> adapter=new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item,list);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        final Spinner sp=(Spinner)rootView.findViewById(R.id.spinner1);
        sp.setAdapter(adapter);

获取下拉列表框选中的值,我常用的方法如下,提取出选中项内容后就可以根据activity所需做相应处理了。

Spring spr=sp.getSelectedItem().toString();
2018-12-24 16:49:38 qifengdeqingchen 阅读数 2745
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    26333 人正在学习 去看看 任苹蜻

前言

有时候我们会有需要在日历上选择一个日期范围的这种需求,先选一个开始日期,然后再选结束日期,如酒店入住日期和离店日期选择,美团携程这种预定酒店的app都有这种操作。那么这种需求该如何实现呢?先看一下要实现的效果。
效果演示

实现思路

如上图所见,首先是展示出了一个月份列表,然后进行选择入住日期和离店日期。这种日历效果该如何实现呢, 用系统的组件是实现不了的需要自定义日历组件,写一个自定义view来展示日期,然后用RecyclerView来展示一个日历列表,每个item都是一个自定日历view,这样就可以显示多个月份的日期,然后在监听日期点击事件,实现选择开始日期和结束日期的逻辑即可。这是实现的方式一,应该也是首先会想到的实现方式,也是没有任何问题的可以实现的。但是呢其实还有另外一种实现方式,不需要自定义日历控件,就可以实现这种需求,用RecyclerView+GridLayoutManager就可以实现,今天我们说的就是这种方式实行此需求。

RecyclerView+GridLayoutManager实现日期范围选择的日历效果

我们知道RecyclerView的GridLayoutManager可以实现网格布局的效果,我们就用这个来实现日历的显示,我们可以看到首先日历的头部是有 周几的显示的,从周日 然后是周一二三四五六,一行是显示七天的日期数据。然后我们就可以设置RecylerView 的GridLayoutManager一行显示7个item展示7天的日期,首先每一行的第一个日期肯定要是周日,第二个显示的是周一的日期,也就是说一个月的第一天肯定是周一到周日的某个周几,如果某个月的1号是周日我们就绘制在第一行的第一个,如果1号是周一就绘制在第一行的第二个位置。一次类推就可以绘制出每个月的每一天1号到31号,就绘制出每个月的月日历,而且都能够跟顶部的周几对上。

具体实现

  1. 首先我们要按照每一行显示7个日期,而且第一个日期是周日后面是周一到周六的形式来生成每个月的日历数据。生成日历数据的逻辑是要判断某个月第一天是周几,如果是周六则在周日到周五来补充空的item来占位即可,如果是周日那正好不用补空,然后我们要判断一个月最后一天是周几如果是周日则需要在后面补充6个空的占位,依次类推,处理完一个月的开始日期结束日期,中间的日期照常生成即可,无需特殊处理,最终将数据存储在数组里即可。
/**
     * 生成日历数据
     */
    private List<DateBean> days(String sDate, String eDate) {
        List<DateBean> dateBeans = new ArrayList<>();
        try {
            Calendar calendar = Calendar.getInstance();
            //日期格式化
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            SimpleDateFormat formatYYYYMM = new SimpleDateFormat("yyyy-MM");

            //起始日期
            Date startDate = new Date();
            calendar.setTime(startDate);

            //结束日期
            calendar.add(Calendar.MONTH, 5);
            Date endDate = new Date(calendar.getTimeInMillis());

            Log.d(TAG, "startDate:" + format.format(startDate) + "----------endDate:" + format.format(endDate));

            //格式化开始日期和结束日期为 yyyy-mm-dd格式
            String endDateStr = format.format(endDate);
            endDate = format.parse(endDateStr);

            String startDateStr = format.format(startDate);
            startDate = format.parse(startDateStr);

            calendar.setTime(startDate);

            Log.d(TAG, "startDateStr:" + startDateStr + "---------endDate:" + format.format(endDate));
            Log.d(TAG, "endDateStr:" + endDateStr + "---------endDate:" + format.format(endDate));

            calendar.set(Calendar.DAY_OF_MONTH, 1);
            Calendar monthCalendar = Calendar.getInstance();


            //按月生成日历 每行7个 最多6行 42个
            //每一行有七个日期  日 一 二 三 四 五 六 的顺序
            for (; calendar.getTimeInMillis() <= endDate.getTime(); ) {

                //月份item
                DateBean monthDateBean = new DateBean();
                monthDateBean.setDate(calendar.getTime());
                monthDateBean.setMonthStr(formatYYYYMM.format(monthDateBean.getDate()));
                monthDateBean.setItemType(DateBean.item_type_month);
                dateBeans.add(monthDateBean);

                //获取一个月结束的日期和开始日期
                monthCalendar.setTime(calendar.getTime());
                monthCalendar.set(Calendar.DAY_OF_MONTH, 1);
                Date startMonthDay = calendar.getTime();

                monthCalendar.add(Calendar.MONTH, 1);
                monthCalendar.add(Calendar.DAY_OF_MONTH, -1);
                Date endMonthDay = monthCalendar.getTime();

                //重置为本月开始
                monthCalendar.set(Calendar.DAY_OF_MONTH, 1);

                Log.d(TAG, "月份的开始日期:" + format.format(startMonthDay) + "---------结束日期:" + format.format(endMonthDay));
                for (; monthCalendar.getTimeInMillis() <= endMonthDay.getTime(); ) {
                    //生成单个月的日历

                    //处理一个月开始的第一天
                    if (monthCalendar.get(Calendar.DAY_OF_MONTH) == 1) {
                        //看某个月第一天是周几
                        int weekDay = monthCalendar.get(Calendar.DAY_OF_WEEK);
                        switch (weekDay) {
                            case 1:
                                //周日
                                break;
                            case 2:
                                //周一
                                addDatePlaceholder(dateBeans, 1, monthDateBean.getMonthStr());
                                break;
                            case 3:
                                //周二
                                addDatePlaceholder(dateBeans, 2, monthDateBean.getMonthStr());
                                break;
                            case 4:
                                //周三
                                addDatePlaceholder(dateBeans, 3, monthDateBean.getMonthStr());
                                break;
                            case 5:
                                //周四
                                addDatePlaceholder(dateBeans, 4, monthDateBean.getMonthStr());
                                break;
                            case 6:
                                addDatePlaceholder(dateBeans, 5, monthDateBean.getMonthStr());
                                //周五
                                break;
                            case 7:
                                addDatePlaceholder(dateBeans, 6, monthDateBean.getMonthStr());
                                //周六
                                break;
                        }
                    }

                    //生成某一天日期实体 日item
                    DateBean dateBean = new DateBean();
                    dateBean.setDate(monthCalendar.getTime());
                    dateBean.setDay(monthCalendar.get(Calendar.DAY_OF_MONTH) + "");
                    dateBean.setMonthStr(monthDateBean.getMonthStr());
                    dateBeans.add(dateBean);

                    //处理一个月的最后一天
                    if (monthCalendar.getTimeInMillis() == endMonthDay.getTime()) {
                        //看某个月第一天是周几
                        int weekDay = monthCalendar.get(Calendar.DAY_OF_WEEK);
                        switch (weekDay) {
                            case 1:
                                //周日
                                addDatePlaceholder(dateBeans, 6, monthDateBean.getMonthStr());
                                break;
                            case 2:
                                //周一
                                addDatePlaceholder(dateBeans, 5, monthDateBean.getMonthStr());
                                break;
                            case 3:
                                //周二
                                addDatePlaceholder(dateBeans, 4, monthDateBean.getMonthStr());
                                break;
                            case 4:
                                //周三
                                addDatePlaceholder(dateBeans, 3, monthDateBean.getMonthStr());
                                break;
                            case 5:
                                //周四
                                addDatePlaceholder(dateBeans, 2, monthDateBean.getMonthStr());
                                break;
                            case 6:
                                addDatePlaceholder(dateBeans, 1, monthDateBean.getMonthStr());
                                //周5
                                break;
                        }
                    }

                    //天数加1
                    monthCalendar.add(Calendar.DAY_OF_MONTH, 1);
                }

                Log.d(TAG, "日期" + format.format(calendar.getTime()) + "----周几" + getWeekStr(calendar.get(Calendar.DAY_OF_WEEK) + ""));
                //月份加1
                calendar.add(Calendar.MONTH, 1);
            }

        } catch (Exception ex) {

        }

        return dateBeans;
    }

    //添加空的日期占位
    private void addDatePlaceholder(List<DateBean> dateBeans, int count, String monthStr) {
        for (int i = 0; i < count; i++) {
            DateBean dateBean = new DateBean();
            dateBean.setMonthStr(monthStr);
            dateBeans.add(dateBean);
        }
    }

    private String getWeekStr(String mWay) {
        if ("1".equals(mWay)) {
            mWay = "天";
        } else if ("2".equals(mWay)) {
            mWay = "一";
        } else if ("3".equals(mWay)) {
            mWay = "二";
        } else if ("4".equals(mWay)) {
            mWay = "三";
        } else if ("5".equals(mWay)) {
            mWay = "四";
        } else if ("6".equals(mWay)) {
            mWay = "五";
        } else if ("7".equals(mWay)) {
            mWay = "六";
        }
        return mWay;
    }

这样就可以用RecyclerView来展示出日历数据了,下面是通过GridLayoutManagere来控制一行展示7个Item如果是一个月份头标题(2018-12)Item则独占一行

GridLayoutManager gridLayoutManager = new GridLayoutManager(context, 7);
        gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int i) {
                if (DateBean.item_type_month == adapter.data.get(i).getItemType()) {
                    return 7;
                } else {
                    return 1;
                }
            }
        });
recyclerView.setLayoutManager(gridLayoutManager);

这样就实现了整个日历的展示效果,开始时间和结束时间的选择逻辑,根据相应的交互逻辑实现即可,在此不赘述了,具体见源码。

实现月份标题悬停的效果

我们仔细看效果图可以发现,月份标题是有一个悬停和慢慢推走的效果的。这个效果可以用ItemDecoration装饰来实现。具体实现是继承ItemDecoration 重写OnDrawOver方法在这个方法要做这么几件事

  1. 绘制出当前月份标题
    如何获取当前要绘制的月份标题是几月份呢?我们RecyclerView的adapter中的数据源DataBean每个日期item都存储了他对应的日期标题,这个日期对应的月份,可以通过 RecyclerView的getAdapter()方法获取Adapter然后通过RecyclerView 的getChildAdapterPosition(fistView)来获取某个itemView在adapter对应的位置 然后从Adapter的数据源中获取每个item的对应的月份。
  2. 如何实现月份标题推走的效果
    逻辑是首先找出当前所有可见的Item的第一个月份标题类型的Item这个Item是当我们滑动列表时下一个悬停的月份标题。然后我们获取这个Item距离顶部的距离view.getTop()当它距离顶部的距离小于等于我们月份标题的高度时,假如标题的高度是150,我们绘制顶部的月份标题顶部的位置就是 150-view.getTop()这样随着位置的推移就会有一个慢慢推走的效果。代码如下
public class MyItemD extends RecyclerView.ItemDecoration {
    Paint paint=new Paint();
    Paint colorPaint=new Paint();
    Paint linePaint=new Paint();

    public MyItemD(){
        paint.setColor(Color.parseColor("#ffffff"));
        paint.setStyle(Paint.Style.FILL);
        colorPaint.setColor(Color.parseColor("#ff6600"));
        colorPaint.setAntiAlias(true);
        linePaint.setAntiAlias(true);
        linePaint.setColor(Color.parseColor("#dddddd"));
    }

    @Override
    public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
        super.onDrawOver(c, parent, state);
        if(parent.getChildCount()<=0){
            return;
        }

        //头部的高度
        int height=50;
        final float scale = parent.getContext().getResources().getDisplayMetrics().density;
        height= (int) (height*scale+0.5f);

        //获取第一个可见的view,通过此view获取其对应的月份
        CalendarList.CalendarAdapter a=(CalendarList.CalendarAdapter) parent.getAdapter();
        View fistView=parent.getChildAt(0);
        String text=a.data.get(parent.getChildAdapterPosition(fistView)).getMonthStr();

        String fistMonthStr="";
        int fistViewTop=0;
        //查找当前可见的itemView中第一个月份类型的item
        for(int i=0;i<parent.getChildCount();i++){
            View v=parent.getChildAt(i);
            if(2==parent.getChildViewHolder(v).getItemViewType()){
                fistMonthStr=a.data.get(parent.getChildAdapterPosition(v)).getMonthStr();
                fistViewTop=v.getTop();
                break;
            }
        }

        //计算偏移量
        int topOffset=0;
        if(!fistMonthStr.equals(text)&&fistViewTop<height){
            //前提是第一个可见的月份item不是当前显示的月份和距离的顶部的距离小于头部的高度
            topOffset=height-fistViewTop;
        }
        int t=0-topOffset;

        //绘制头部区域
        c.drawRect(parent.getLeft(),t,parent.getRight(),t+height,paint);

        colorPaint.setTextAlign(Paint.Align.CENTER);
        colorPaint.setTextSize(15*scale+0.5f);
        //绘制头部月份文字
        c.drawText(text,parent.getRight()/2,(t+height)/2,colorPaint);
        
    }


}

github地址

源码
后续会考虑把它做成三方库的形式方便大家使用。

2014-03-26 11:30:26 u014078192 阅读数 4343
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    26333 人正在学习 去看看 任苹蜻

Android中,也可以通过组件实现HTML表单中的各种功能,但这里不包含隐藏域的组件,因为没有必要。

常用的表单组件中,比较复杂的是选择类的组件,这里可以使用以下的组件实现:单选,多选,下拉列表,日期选择,时间选择的功能。

一、单选,多选:

<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:background="@drawable/login_bg"
    android:orientation="vertical"
    android:paddingBottom="5dp"
    android:paddingLeft="5dp"
    android:paddingRight="5dp"
    android:paddingTop="5dp" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="性别: "
        android:textColor="#000000" />

    <RadioGroup
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <RadioButton
            android:text="男"
            android:textColor="#000000" />

        <RadioButton
            android:text="女"
            android:textColor="#000000" />
    </RadioGroup>

</LinearLayout>

单选应该还支持默认选中功能。

<RadioButton
            android:text="男"
            android:checked="true"
            android:textColor="#000000" />

但要注意,这样写有bug,如果写上为true,则永远无法再进行切换,一直为true

因此建议在程序中进行默认选中的设置。

RadioGroup
        android:id="@+id/radio"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >
public class MainActivity extends Activity {

	private RadioGroup radio;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// 设置所使用的布局界面
		setContentView(R.layout.activity_main);

		radio = (RadioGroup) findViewById(R.id.radio);

		// 可以通过check()方法来设置选中某一个单选,但要传递该单选按钮的id值.
		// 如果为每个单选按钮设置id, 比较麻烦,因此这里通过 按钮的position下标,直接取得按钮,再通过getId()取得id值来设置.
		radio.check(radio.getChildAt(0).getId());

	}
}

如果选项不是写死的形式,而是通过传递的集合数据动态生成的,可以通过程序来进行选项的建立。

public class MainActivity extends Activity {

	private RadioGroup radio;

	private String[] allValues = { "男", "女", "未知" };

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// 设置所使用的布局界面
		setContentView(R.layout.activity_main);

		radio = (RadioGroup) findViewById(R.id.radio);

		// 可以通过check()方法来设置选中某一个单选,但要传递该单选按钮的id值.
		// 如果为每个单选按钮设置id, 比较麻烦,因此这里通过 按钮的position下标,直接取得按钮,再通过getId()取得id值来设置.
		// radio.check(radio.getChildAt(0).getId());

		// 动态为单选按钮组加入选项
		// 循环数组或集合,建立单选按钮
		for (int i = 0; i < allValues.length; i++) {
			RadioButton button = new RadioButton(this);
			button.setText(allValues[i]);
			button.setTextColor(Color.BLACK);
			radio.addView(button);
		}
	}}

多选框使用方法与单选基本相同,只不过换成CheckBox

这里没有CheckBoxGroup,可以直接使用LinearLayout替代之前的RadioGroup

<LinearLayout
        android:id="@+id/checkbox"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <CheckBox
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:checked="true"
            android:text="巴厘岛"
            android:textColor="#000000" />

        <CheckBox
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:checked="true"
            android:text="马尔代夫"
            android:textColor="#000000" />

        <CheckBox
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="三亚"
            android:textColor="#000000" />

        <CheckBox
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="香格里拉"
            android:textColor="#000000" />

        <CheckBox
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:checked="true"
            android:text="马来西亚"
            android:textColor="#000000" />
    </LinearLayout>

二、Spinner下拉列表

下拉列表中的数据不能直接加入,可以通过XML来进行固定的配置,或使用Adpater来动态加入。

写死的数据,可以打开values.xml,来加入一段配置。

<Spinner
        android:id="@+id/spinner"
        android:entries="@array/area_array"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

//这里的@array的数据就是在strngs.xml中声明的String Array数组

如果想动态生成数据,也要通过程序完成,需要建立一个ArrayAdapter的类,来转换传入的List集合或String[]数据。

// 取得Spinner组件
		spinner = (Spinner) findViewById(R.id.spinner);
		// 根据数据,建立适配器
		adapter = new ArrayAdapter<String>(this,
				android.R.layout.simple_spinner_item, allAreaValues);
		// 设置选项弹出后的显示样式
		adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

		spinner.setAdapter(adapter);


//如果不想使用系统自带的显示样式,也可以自己在res/layout中声明一个自定义的TextView的样式。

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:textColor="#ff0000"
    android:textSize="15sp"
    android:layout_height="wrap_content" >

</TextView>
// 根据数据,建立适配器
		adapter = new ArrayAdapter<String>(this,
				R.layout.my_spinner_item, allAreaValues);

三、日期时间选择器、滚动面板

日期选择器的设置

<TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="选择生日: "
        android:textColor="#000000" />

    <DatePicker
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

但这时,内容已经超出了屏幕范围,因此需要加入一个滚动面版,来实现屏幕滚动的功能。

滚动面版中要求只能有一个子节点。

因此这里要将滚动面版ScrollView加入到最外面,作为根节点来使用

<ScrollView 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" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/login_bg"
        android:orientation="vertical"
        android:paddingBottom="5dp"
        android:paddingLeft="5dp"
        android:paddingRight="5dp"
        android:paddingTop="5dp" >

同时,里面的LinearLayout的高度,必须设置成为wrap_content

如果想使用水平滚动支持,可以加入水平滚动面版

还可以取消滚动条的显示

<ScrollView 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:scrollbars="none" >

时间选择也可以通过TimePicker来实现。

<TimePicker
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />








2013-09-30 17:27:01 nmsoftklb 阅读数 4594
  • 快速入门Android开发 视频 教程 android studio

    这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

    26333 人正在学习 去看看 任苹蜻

1、在一个EditText 中单击一下可以弹出日期对话框:

    private static int START;
    private int mYear;
    private int mMonth;
    private int mDay;

    private class SetParaImpl implements OnClickListener {

        @Override
        public void onClick(View v) {
            switch (v.getId()) {
            case R.id.start_time:
                START = 1;
                new DatePickerDialog(MainActivity.this, mDateSetListener, mYear, mMonth, mDay).show();
                break;
            case R.id.end_time:
                START = 2;
                new DatePickerDialog(MainActivity.this, mDateSetListener, mYear, mMonth, mDay).show();
                break;
            case R.id.set_param:
                startActivity(new Intent(MainActivity.this, EnvironmentSetActivity.class));
                break;
            case R.id.query:
                startActivity(new Intent(MainActivity.this, AchartengineActivity.class));
                break;
            default:
                break;
            }
        }

    }

    private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {

        @Override
        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {

            mYear = year;
            mMonth = monthOfYear;
            mDay = dayOfMonth;
            if (START == 1) {
                JavaUtils.updateDisplay(START, startTime, mYear, mMonth, mDay);
            } else if (START == 2) {
                JavaUtils.updateDisplay(START, endTime, mYear, mMonth, mDay);
            }
        }

    };

2、
public class JavaUtils {
    public static void updateDisplay(int start, EditText view, int mYear, int mMonth, int mDay) {
        if (start == 1) {

            view.setText(new StringBuilder().append(mYear).append("-").append((mMonth + 1) < 10 ? "0" + (mMonth + 1) : (mMonth + 1)).append("-").append((mDay + 1) < 10 ? "0" + (mDay) : (mDay)));
        } else {
            view.setText(new StringBuilder().append(mYear).append("-").append((mMonth + 1) < 10 ? "0" + (mMonth + 1) : (mMonth + 1)).append("-").append((mDay + 1) < 10 ? "0" + (mDay) : (mDay)));
        }

    }
}

3、下拉列表的使用:

            condition = (Spinner) view.findViewById(R.id.condition);
            adapterItem = ArrayAdapter.createFromResource(GreenHouseActivity.this, R.array.condition, android.R.layout.simple_spinner_item); // 从资源文件中读取选项内容

            adapterItem.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // 设置列表显示风格
            condition.setAdapter(adapterItem); // 设置下拉列表选项

            condition.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                    android.util.Log.d("mark", "p=" + position);
                }

                @Override
                public void onNothingSelected(AdapterView<?> parent) {
                    // TODO Auto-generated method stub

                }
            });

note:R.array.condition 放置在values 文件下的array.xml 中:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="condition">
        <item>月</item>
        <item>周</item>
        <item>天</item>
        <item>6小时</item>
    </string-array>
</resources>

自定义下拉列表:

    private void homeSeceneMode() {
        ArrayAdapter<CharSequence> adapterMode = null; // 下拉列表内容适配器

        List<CharSequence> data = new CURDTable(this).allSeceneMode();
        if (data != null) {
            adapterMode = new ArrayAdapter<CharSequence>(this, android.R.layout.simple_spinner_item, data);
            adapterMode.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // 设置下拉列表显示风格
            this.homeSeceneMode.setAdapter(adapterMode);
        }
    }

    public List<CharSequence> allSeceneMode() {
        db = this.helper.getReadableDatabase();
        List<CharSequence> info = new ArrayList<CharSequence>();
        String sql = "select name  from secene_mode_tb";
        Cursor cursor = db.rawQuery(sql, null);
        while (cursor.moveToNext()) {
  
            info.add(cursor.getString(cursor.getColumnIndex("name")));
        }
        db.close();
        return info;
    }



android

阅读数 159

Android对话框

阅读数 47

没有更多推荐了,返回首页