作者的版本:

layout (main.xml):

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="vertical" >
  6. <Switch
  7. android:id="@+id/switchdemo"
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:text="WTF?" />
  11. </LinearLayout>

java代码:

  1. public class SwitchActivity extends Activity
  2. implements CompoundButton.OnCheckedChangeListener {
  3. Switch sw;
  4.  
  5. @Override
  6. public void onCreate(Bundle icicle) {
  7. super.onCreate(icicle);
  8. setContentView(R.layout.main);
  9.  
  10. sw=(Switch)findViewById(R.id.switchdemo);
  11. sw.setOnCheckedChangeListener(this);
  12. }
  13.  
  14. // @Override
  15. public void onCheckedChanged(CompoundButton buttonView,
  16. boolean isChecked) {
  17. if (isChecked) {
  18. sw.setTextOn("This switch is: on");
  19. }
  20. else {
  21. sw.setTextOff("This switch is: off");
  22. }
  23. }
  24. }

作者提供的 java 代码有问题. 原因参考(http://stackoverflow.com/questions/29811646/android-settexton-not-working-in-oncheckchanged-method)

I don't think your calls to setTextOn and setTextOff need to be in an if - they just define how the toggle appears when on or off, so they don't need to be set conditionally. Ref: API – Simon MᶜKenzie Apr 23 '15 at 1:01


The setTextOn and setTextOff functions are to used to set the labels depending on the state of the Switch.

The text "The switch is: On" is just the label of your Switch and does not convey the state of your Switch.

To achieve the result that you want, you need to call setShowText(true):

  1. sw = (Switch)findViewById(R.id.swish);
  2. sw.setShowText(true);

or you can add it in your XML.

  1. <Switch
  2. android:layout_width="453dp"
  3. android:layout_height="100dp"
  4. android:id="@+id/swish"
  5. android:layout_gravity="center_vertical"
  6. android:layout_alignParentTop="true"
  7. android:showText="true"/>

As observed by @Simon M, this xml and java snippet produce consistent output as shown by the screen below.

  1. <Switch
  2. android:layout_width="453dp"
  3. android:layout_height="100dp"
  4. android:id="@+id/swish"
  5. android:layout_gravity="center_vertical"
  6. android:textOn="ON!!"
  7. android:textOff="OFF!"
  8. android:layout_alignParentTop="true"
  9. android:layout_centerHorizontal="true"/>
  10. sw = (Switch)findViewById(R.id.swish);
  11. sw.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
  12. @Override
  13. public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
  14. // absolutely nothing
  15. });
  1.  

答案说的很清楚了. 只需要在 onCreate 里面调用 setTextOn/Off 即可. onCheckedChanged 什么都不用做. 或者根本步调用 setTextOn/Off, 直接在 main.xml 中用 `android::textOn/Off`即可.

下面是修改后的 java 实现, 没有修改 main.xml, 也展示了 setText 与 setTextOn/Off 的区别.

  1. public class SwitchActivity extends ActionBarActivity implements CompoundButton.OnCheckedChangeListener {
  2.  
  3. Switch sw;
  4. @Override
  5. public void onCreate(Bundle icicle) {
  6. super.onCreate(icicle);
  7. setContentView(R.layout.main);
  8. sw=(Switch)findViewById(R.id.switchdemo);
  9. sw.setOnCheckedChangeListener(this);
  10. sw.setTextOff("#OFF#");
  11. sw.setTextOn("#ON#");
  12. }
  13.  
  14. public void onCheckedChanged(CompoundButton buttonView,
  15. boolean isChecked) {
  16. if (isChecked) {
  17. sw.setText("I'm On.");
  18. } else {
  19. sw.setText("I'm Off.");
  20. }
  21. }
  22. }

Beginning Android 4 中 Demo Basic/Switch 的问题.的更多相关文章

  1. Android Studio中Switch控件有关 thumb 和 track 用法

    •任务 •属性 android:track:底部的图片(灰->绿) android:thumb:设置 Switch 上面滑动的滑块,也就是上图中的白色圆形滑块 •switch_thumb 点击 ...

  2. 如何在Android Studio中使用Gradle发布项目至Jcenter仓库

    简述 目前非常流行将开源库上传至Jcenter仓库中,使用起来非常方便且易于维护,特别是在Android Studio环境中,只需几步配置就可以轻松实现上传和发布. Library的转换和引用 博主的 ...

  3. MVP模式在Android开发中的应用

    一.MVP介绍      随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责.为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数据的可视化以及与用户的交互.同一 ...

  4. Android编程中的5种数据存储方式

    Android编程中的5种数据存储方式 作者:牛奶.不加糖 字体:[增加 减小] 类型:转载 时间:2015-12-03我要评论 这篇文章主要介绍了Android编程中的5种数据存储方式,结合实例形式 ...

  5. 【Android】打电话Demo及Android6.0的运行时权限

    新手开局,查看一些旧资料,从打电话.发短信的小应用开始.代码很简单,主要是学习了: 用StartActivity()激活一个Activity组件.这里是激活了系统原生的打电话和发短信Activity. ...

  6. Intent 对象在 Android 开发中的应用

    转自(http://www.ibm.com/developerworks/cn/opensource/os-cn-android-intent/) Android 是一个开放性移动开发平台,运行在该平 ...

  7. android Service中多线程交互

    android 的service和activity是执行在UI主线程的. 在android线程中,仅仅有主线程即UI线程有自己的默认的消息队列.子线程须要创建自己的消息队列.并把消息发给队列,并循环起 ...

  8. NDK笔记(二)-在Android Studio中使用ndk-build

    前面一篇我们接触了CMake,这一篇写写关于ndk-build的使用过程.刚刚用到,想到哪儿写哪儿. 环境背景 Android开发IDE版本:AndroidStudio 2.2以上版本(目前已经升级到 ...

  9. TensorFlow 在android上的Demo(1)

    转载时请注明出处: 修雨轩陈 系统环境说明: ------------------------------------ 操作系统 : ubunt 14.03 _ x86_64 操作系统 内存: 8GB ...

随机推荐

  1. TCP/IP基础知识

    TCP/IP基础知识 网络 TCP/IP 引言 本篇属于TCP/IP协议的基础知识,重点介绍了TCP/IP协议簇的内容.作用以及TCP.UDP.IP三种常见网络协议相关的基础知识. 内容 TCP/IP ...

  2. Linux 下找出超過某些容量的檔案

    找目前所在位置下,所有檔案大小超過3M的file,並列出檔名:大小 find . -type f -size +3M -exec ls -alh {} \; | awk '{print$9 " ...

  3. JS相关环境搭建:Nodejs、karma测试框架、jsDuck、Express

    第一章:压缩js(nodejs,uglify) 第一步:安装nodejs环境 直接下载http://www.nodejs.org/download/ 下载完成后直接下一步下一步即可,完了我们就具有no ...

  4. linux vi 删除多行的方法

    dd 删除一行 d$ 删除以当前字符开始的一行字符 ndd 删除以当前行开始的n行 dw 删除以当前字符开始的一个字 ndw 删除以当前字符开始的n个字 D 与d$同义 d) 删除到下一句的开始 d} ...

  5. jsp页面价格

    <div class='flo_left'> <h2 class='red'>订货价¥${productEntity.agentsPrice}</h2> <h ...

  6. ThreadLocal解析

    ThreadLocal 如果定义了一个单实例的java bean,它有若干属性,但是有一个属性不是线程安全的,比如说HashMap.并且碰巧你并不需要在不同的线程中共享这个属性,也就是说这个属性不存在 ...

  7. 19.创建如下三个类:(People类中的三个方法分别输出一些信息,ChinaPeople 和AmericanPeople类重写父类的三个方法)。

    package zuoye2; public class People { protected double height; protected double weight; private Stri ...

  8. 通过button返回一个action,跳转到一个view

    可以参考采购单的右侧按钮的写法. 简单讲,就是先通过xmlid获取到action_id,继而获取到action,修改action的相关信息,然后将结果返回,即可以实现跳转. mod_obj = sel ...

  9. jquery中each遍历各种标签方法

    这写天用到的遍历jquery each方法比较频繁 刚好有时间,就在这里记录一下 jquery用的是bootstrap的线上文件 不需要导入 <!DOCTYPE html><html ...

  10. js再学习笔记

    #js再学习笔记 ##基本 1.js严格区分大小写   2.js末尾的分号可加,也可不加   3.六种数据类型(使用typeof来检验数据的类型) `typeof` - undefined: `var ...