Android开发中那些你费力写的控件,其实原生都有

简介: 实现一个开关的切换,你会怎么做,写一个layout,一半点击为开,一半点击为关,还是两张图片,点一下开,再点一下关?让你实现一个根据用户的输入弹出一个下拉菜单等等,其实都大可没有必要去自己写,本身Android里都有,下面对各个控件,我会一一举例。

本篇文章重点讲解Android中那些你忽略的控件:


1、SearchView

2、Switch

3、AutoCompleteTextView

4、CalendarView

5、DatePicker

6、Chronomet

7、ExpandableListView

8、ViewSwitcher


开发当中比如说让你写一个根据用户的输入,去搜索相关内容,你会怎么实现,写一个输入框,监听输入框的内容变化,调起软键盘的搜索或者确认键进行搜索?还有,让你实现一个开关的切换,你会怎么做,写一个layout,一半点击为开,一半点击为关,还是两张图片,点一下开,再点一下关?让你实现一个根据用户的输入弹出一个下拉菜单等等,其实都大可没有必要去自己写,本身Android里都有,下面对各个控件,我会一一举例。


1、SearchView


SearchView这个控件,主要用来处理用户的输入,并对用户的输入做出响应。


先看下各个属性介绍:


属性名称

相关方法

描述

android:iconifiedByDefault

setIconifiedByDefault(boolean)

设置搜索图标是否显示在搜索框内

android:imeOptions

setImeOptions(int)

设置输入法搜索选项字段,默认是搜索,可以是:下一页、发送、完成等

android:inputType

setInputType(int)

设置输入类型

android:maxWidth

setMaxWidth(int)

设置最大宽度

android:queryHint

setQueryHint(CharSequence)

设置查询提示字符串


XML里引用


<SearchViewandroid:id="@+id/seach"android:layout_width="match_parent"android:layout_height="50dp"android:iconifiedByDefault="false"android:queryHint="请输入要搜寻的东西"/>


代码里通过以下方法可以监听用户的输入


SearchViewmSearchView= (SearchView) findViewById(R.id.seach);
mSearchView.setOnQueryTextListener(newSearchView.OnQueryTextListener() {
//点击搜索@OverridepublicbooleanonQueryTextSubmit(Stringquery) {
Log.i("MainActivity", query);
returnfalse;
    }
//搜索内容改变@OverridepublicbooleanonQueryTextChange(StringnewText) {
Log.i("MainActivity", newText);
returnfalse;
    }
});


具体效果可见下图:


image.gif


2、Switch


Switch控件主要作用是描述一个开关,可以滑动,也可以点击,省去了我们自定义的很多不必要的麻烦。


XML里引用


<Switchandroid:id="@+id/switchs"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"/>


代码里监听状态


SwitchmSwitch=(Switch)  findViewById(R.id.switchs);
mSwitch.setOnCheckedChangeListener(newCompoundButton.OnCheckedChangeListener() {
@OverridepublicvoidonCheckedChanged(CompoundButtonbuttonView, booleanisChecked) {
//开if(isChecked){
        }else{
//关        }
    }
});


具体效果如下图:


image.gif


具体UI我们可以自己来调整,可通过下面两个属性,第一个设置是设置拖动按钮,第二个是设置背景。


android:thumb="@drawable/switch_bg”
android:track="@drawable/track_bg"


设置自动选中状态可以通过android:checked="true”来设置。


3、AutoCompleteTextView


AutoCompleteTextView控件可以根据用户的输入,弹出一个下拉菜单


AutoCompleteTextView常用属性

android:completionHint

设置出现在下拉菜单中的提示标题

android:completionThreshold

设置用户至少输入多少个字符才会显示提示

android:dropDownHorizontalOffset

下拉菜单于文本框之间的水平偏移。默认与文本框左对齐

android:dropDownHeight

下拉菜单的高度

android:dropDownWidth

下拉菜单的宽度

android:singleLine

单行显示

android:dropDownVerticalOffset

垂直偏移量


XML里引用:


<AutoCompleteTextViewandroid:layout_width="match_parent"android:layout_height="50dp"android:id="@+id/autotext"/>


代码实现:


AutoCompleteTextViewautotext=(AutoCompleteTextView) findViewById(R.id.autotext);
finalString [] arr={"1001","1002","1003","1004"};
ArrayAdapterarrayAdapter=newArrayAdapter<String>(this, android.R.layout.simple_list_item_1,arr);
//设置Adapterautotext.setAdapter(arrayAdapter);
//监听item选择autotext.setOnItemClickListener(newAdapterView.OnItemClickListener() {
@OverridepublicvoidonItemClick(AdapterView<?>parent, Viewview, intposition, longid) {
Toast.makeText(MainActivity.this,arr[position],Toast.LENGTH_LONG).show();
    }
});


具体效果见下图:


image.gif


4、CalendarView


CalendarView这个控件是要是用于显示日历。


其各个属性如下显示:


android:dateTextAppearance  设置日历View在日历表格中的字体皮肤;

android:firstDayOfWeek   指定日历第一个星期的第一天,在日历中横向所在位置,从右边向左数,从1开始计数;

android:focusedMonthDateColor  设置日历表格当月显示的日期字体颜色;

android:maxDate 设置日历能够显示的最大日期;

android:minDate 设置日历能够显示的最小日期;

android:selectedDateVerticalBar 设置当前选择日期选择边框左右两边显示的图标;

android:selectedWeekBackgroundColor  设置当前选择日期所在行的背景颜色(除了选中的日期之外);

android:showWeekNumber   设置是否显示周期数量;

android:shownWeekCount 设置设备一屏显示多少周即多少行;

android:unfocusedMonthDateColor  设置非当前选择月的字体颜色与focusedMonthDateColor相反;

android:weekNumberColor  设置显示周期编号字体的颜色;

android:weekSeparatorLineColor  设置日历每行之间分割线的颜色;


XML里引用:


<CalendarViewandroid:id="@+id/calendar"android:layout_width="match_parent"android:layout_height="match_parent"/>


代码实现选择日期:


CalendarViewmCalendarView=(CalendarView) findViewById(R.id.calendar);
//获取日期点击事件mCalendarView.setOnDateChangeListener(newCalendarView.OnDateChangeListener() {
@OverridepublicvoidonSelectedDayChange(CalendarViewview, intyear, intmonth, intdayOfMonth) {
Toast.makeText(MainActivity.this,year+"==="+(month+1)+"==="+dayOfMonth,Toast.LENGTH_LONG).show();
    }
});


效果如下图:


image.gif


5、DatePicker


DatePicker控件和CalendarView基本类似,都是用来显示日期,只不过了一个显示选择后的日期UI,

    • android:calendarViewShown:是否显示日历。
    • android:startYear:设置可选开始年份。
    • android:endYear:设置可选结束年份。
    • android:maxDate:设置可选最大日期,以mm/dd/yyyy格式设置。
    • android:minDate:设置可选最小日期,以mm/dd/yyyy格式设置。


    XML里引用


    <DatePickerandroid:id="@+id/datePicker"android:layout_width="wrap_content"android:layout_height="wrap_content"/>


    代码实现:


    DatePickermDatePicker=(DatePicker) findViewById(R.id.datePicker);
    //初始化日期mDatePicker.init(2017, 7, 16, newDatePicker.OnDateChangedListener() {
    @OverridepublicvoidonDateChanged(DatePickerview, intyear, intmonthOfYear, intdayOfMonth) {
    Toast.makeText(MainActivity.this, year+"==="+monthOfYear+"=="+dayOfMonth, Toast.LENGTH_SHORT).show();
        }
    });


    效果如下图:


    image.gif


    6、Chronomet:


    Chronomet控件用来展示一个倒计时。

    XML里引用,这里我添加了几个按钮,用来控制开始,暂停,和重置,format用于格式化时间。


    <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#fff"><Chronometerandroid:id="@+id/chronometer"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:format="计时:%s"/><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/chronometer"android:layout_centerHorizontal="true"android:layout_marginTop="10dp"><Buttonandroid:id="@+id/start"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="开始"/><Buttonandroid:id="@+id/stop"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="暂停"/><Buttonandroid:id="@+id/reset"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="重置"/></LinearLayout></RelativeLayout>


    在代码里实现定时任务:


    publicclassMainActivityextendsAppCompatActivity {
    privateChronometermChronometer;
    @OverrideprotectedvoidonCreate(BundlesavedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_svg);
    mChronometer= (Chronometer) findViewById(R.id.chronometer);
    mChronometer.setFormat("计时:%s");
    findViewById(R.id.start).setOnClickListener(onClickLitener);
    findViewById(R.id.stop).setOnClickListener(onClickLitener);
    findViewById(R.id.reset).setOnClickListener(onClickLitener);
        }
    privateView.OnClickListeneronClickLitener=newView.OnClickListener() {
    @OverridepublicvoidonClick(Viewv) {
    switch (v.getId()) {
    caseR.id.start://开始mChronometer.start();
    break;
    caseR.id.stop://停止mChronometer.stop();
    break;
    caseR.id.reset://重置mChronometer.setBase(SystemClock.elapsedRealtime());
    break;
                }
            }
        };
    }


    具体效果可见下图:


    image.gif


    7、ExpandableListView


    ExpandableListView控件主要用于实现一个可以下拉的下单,用起来也是很简单:


    XML里引用:


    <ExpandableListViewandroid:id="@+id/listview"android:layout_width="match_parent"android:layout_height="match_parent"/>


    业务逻辑代码实现:


    publicclassMainActivityextendsAppCompatActivity {
    privateList<String>groupArray=newArrayList<>();
    privateList<List<String>>childArray=newArrayList<>();
    privateList<String>tempArray=newArrayList<String>();
    privateList<String>tempArray2=newArrayList<String>();
    @OverrideprotectedvoidonCreate(BundlesavedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_svg);
    groupArray.add("百家姓");
    groupArray.add("国家行政区划");
    tempArray.add("李");
    tempArray.add("王");
    tempArray.add("刘");
    tempArray.add("张");
    tempArray2.add("商丘市");
    tempArray2.add("北京市");
    tempArray2.add("天津市");
    tempArray2.add("上海市");
    childArray.add(tempArray);
    childArray.add(tempArray2);
    ExpandableListViewmExpandableListView= (ExpandableListView) findViewById(R.id.listview);
    mExpandableListView.setAdapter(newExpandableAdapter());
    //获取item点击事件mExpandableListView.setOnChildClickListener(newExpandableListView.OnChildClickListener() {
    @OverridepublicbooleanonChildClick(ExpandableListViewparent, Viewv, intgroupPosition, intchildPosition, longid) {
    Toast.makeText(MainActivity.this, childArray.get(groupPosition).get(childPosition), Toast.LENGTH_SHORT).show();
    returnfalse;
                }
            });
        }
    //ExpandableListView的AdapterpublicclassExpandableAdapterextendsBaseExpandableListAdapter {
    publicObjectgetChild(intgroupPosition, intchildPosition) {
    returnchildArray.get(groupPosition).get(childPosition);
            }
    publiclonggetChildId(intgroupPosition, intchildPosition) {
    returnchildPosition;
            }
    publicintgetChildrenCount(intgroupPosition) {
    returnchildArray.get(groupPosition).size();
            }
    publicViewgetChildView(intgroupPosition, intchildPosition,
    booleanisLastChild, ViewconvertView, ViewGroupparent) {
    Stringstring=childArray.get(groupPosition).get(childPosition);
    returngetGenericView(string);
            }
    // group method stubpublicObjectgetGroup(intgroupPosition) {
    returngroupArray.get(groupPosition);
            }
    publicintgetGroupCount() {
    returngroupArray.size();
            }
    publiclonggetGroupId(intgroupPosition) {
    returngroupPosition;
            }
    publicViewgetGroupView(intgroupPosition, booleanisExpanded,
    ViewconvertView, ViewGroupparent) {
    Stringstring=groupArray.get(groupPosition);
    returngetGenericView(string);
            }
    publicTextViewgetGenericView(Stringstring) {
    AbsListView.LayoutParamslayoutParams=newAbsListView.LayoutParams(
    ViewGroup.LayoutParams.FILL_PARENT, 64);
    TextViewtext=newTextView(MainActivity.this);
    text.setLayoutParams(layoutParams);
    text.setGravity(Gravity.CENTER_VERTICAL|Gravity.LEFT);
    text.setPadding(100, 0, 0, 0);
    text.setTextColor(Color.parseColor("#000000"));
    text.setText(string);
    returntext;
            }
    publicbooleanhasStableIds() {
    returnfalse;
            }
    publicbooleanisChildSelectable(intgroupPosition, intchildPosition) {
    returntrue;
            }
        }
    }


    具体效果如下:


    image.gif


    8、ViewSwitcher


    ViewSwitcher控件是一个可以实现layout上下或者左右翻滚的效果,也就是所谓的翻页效果。


    XML里引用:


    <ViewSwitcherandroid:id="@+id/viewSwitch"android:layout_width="match_parent"android:layout_height="wrap_content"/>


    代码实现:


    publicclassMainActivityextendsAppCompatActivity {
    privateScheduledExecutorServicescheduledExecutorService;
    privateViewSwitchermViewSwitcher;
    @OverrideprotectedvoidonCreate(BundlesavedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_svg);
    mViewSwitcher= (ViewSwitcher) findViewById(R.id.viewSwitch);
    mViewSwitcher.setFactory(newViewSwitcher.ViewFactory() {
    @OverridepublicViewmakeView() {
    returnView.inflate(MainActivity.this, R.layout.activity_text, null);
                }
            });
    //设置切入动画TranslateAnimationanimationTop=newTranslateAnimation(0, 0, -15, 0);
    animationTop.setFillAfter(true);
    animationTop.setDuration(200);
    mViewSwitcher.setInAnimation(animationTop);
    //设置切出动画TranslateAnimationanimationBottom=newTranslateAnimation(0, 0, 0, 60);
    animationBottom.setFillAfter(true);
    animationBottom.setDuration(200);
    mViewSwitcher.setOutAnimation(animationBottom);
        }
    @OverrideprotectedvoidonStart() {
    super.onStart();
    scheduledExecutorService=Executors.newSingleThreadScheduledExecutor();
    scheduledExecutorService.scheduleAtFixedRate(newRunnable() {
    @Overridepublicvoidrun() {
    handler.obtainMessage().sendToTarget();
                }
            }, 1, 5, TimeUnit.SECONDS);
        }
    privateString[] tags= {
    "我是第一段文字",
    "我是第二段文字",
    "我是第三段文字",
    "我是第四段文字"    };
    privateintindexSel;
    privateandroid.os.Handlerhandler=newandroid.os.Handler() {
    @OverridepublicvoidhandleMessage(Messagemsg) {
    super.handleMessage(msg);
    mViewSwitcher.getNextView().findViewById(R.id.text).setVisibility(View.VISIBLE);
    Stringtag=tags[indexSel%tags.length];
                ((TextView) mViewSwitcher.getNextView().findViewById(R.id.text)).setText(tag);
    mViewSwitcher.showNext();
    indexSel++;
            }
        };


    具体效果如图(图片静态,实际可以翻滚):


    image.gif

    相关文章
    |
    30天前
    |
    搜索推荐 前端开发 API
    探索安卓开发中的自定义视图:打造个性化用户界面
    在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
    53 19
    |
    30天前
    |
    JSON Java API
    探索安卓开发:打造你的首个天气应用
    在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
    60 14
    |
    1月前
    |
    Java Linux 数据库
    探索安卓开发:打造你的第一款应用
    在数字时代的浪潮中,每个人都有机会成为创意的实现者。本文将带你走进安卓开发的奇妙世界,通过浅显易懂的语言和实际代码示例,引导你从零开始构建自己的第一款安卓应用。无论你是编程新手还是希望拓展技术的开发者,这篇文章都将为你打开一扇门,让你的创意和技术一起飞扬。
    |
    1月前
    |
    XML 存储 Java
    探索安卓开发之旅:从新手到专家
    在数字时代,掌握安卓应用开发技能是进入IT行业的关键。本文将引导读者从零基础开始,逐步深入安卓开发的世界,通过实际案例和代码示例,展示如何构建自己的第一个安卓应用。我们将探讨基本概念、开发工具设置、用户界面设计、数据处理以及发布应用的全过程。无论你是编程新手还是有一定基础的开发者,这篇文章都将为你提供宝贵的知识和技能,帮助你在安卓开发的道路上迈出坚实的步伐。
    34 5
    |
    30天前
    |
    开发框架 Android开发 iOS开发
    安卓与iOS开发中的跨平台策略:一次编码,多平台部署
    在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
    |
    1月前
    |
    XML 搜索推荐 前端开发
    安卓开发中的自定义视图:打造个性化UI组件
    在安卓应用开发中,自定义视图是一种强大的工具,它允许开发者创造独一无二的用户界面元素,从而提升应用的外观和用户体验。本文将通过一个简单的自定义视图示例,引导你了解如何在安卓项目中实现自定义组件,并探讨其背后的技术原理。我们将从基础的View类讲起,逐步深入到绘图、事件处理以及性能优化等方面。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
    |
    1月前
    |
    搜索推荐 前端开发 测试技术
    打造个性化安卓应用:从设计到开发的全面指南
    在这个数字时代,拥有一个定制的移动应用不仅是一种趋势,更是个人或企业品牌的重要延伸。本文将引导你通过一系列简单易懂的步骤,从构思你的应用理念开始,直至实现一个功能齐全的安卓应用。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你提供必要的工具和知识,帮助你将创意转化为现实。
    |
    1月前
    |
    Java 调度 Android开发
    安卓与iOS开发中的线程管理差异解析
    在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
    |
    1月前
    |
    Java Android开发 开发者
    探索安卓开发:构建你的第一个“Hello World”应用
    在安卓开发的浩瀚海洋中,每个新手都渴望扬帆起航。本文将作为你的指南针,引领你通过创建一个简单的“Hello World”应用,迈出安卓开发的第一步。我们将一起搭建开发环境、了解基本概念,并编写第一行代码。就像印度圣雄甘地所说:“你必须成为你希望在世界上看到的改变。”让我们一起开始这段旅程,成为我们想要见到的开发者吧!
    37 0
    |
    1月前
    |
    存储 监控 Java
    探索安卓开发:从基础到进阶的旅程
    在这个数字时代,移动应用已成为我们日常生活的一部分。对于开发者来说,掌握安卓开发不仅是技能的提升,更是通往创新世界的钥匙。本文将带你了解安卓开发的核心概念,从搭建开发环境到实现复杂功能,逐步深入安卓开发的奥秘。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的见解和技巧,帮助你在安卓开发的道路上更进一步。
    26 0