当我们需要为应用程序的用户提供打开/关闭给定功能的功能时,我们会自动想到复选框,切换按钮或开关:

Android开发实现多位开关按钮 android 开关_java

这些小部件可以直接使用,但是我们局限于特定的外观,这可能是我们在应用程序中想要的,也可能不是我们想要的。 我们可以自定义开关,但是如果要寻找完全不同的东西,还有其他方法可以为用户提供有关是否启用给定功能的视觉反馈,例如纯文本和几个图标:

Android开发实现多位开关按钮 android 开关_python_02

Android开发实现多位开关按钮 android 开关_Android开发实现多位开关按钮_03

我们可以通过直接触摸文本字段来从一种状态切换到另一种状态,而不是使用按钮,开关或复选框,而在所有Android版本上都具有一致的外观。 但是如何?

1.选择开/关图标

如果我们还没有图标,那么使用Android Asset Studio的图标生成器来创建图标是快速且容易的。

2.选择开/关颜色

在我们的Android项目的res / values / colors.xml文件中:



#FFFFFF #FFFFE0



3.创建布局

它只是一个可单击的TextView及其关联的Drawable:




在这里,onClick事件处理程序toggleWifi在XML中声明,并将在相应的Activity中实现。

4.编辑关联的活动

//inside Activity
//...
// field
private TextView tvWifi;
// flag saved in prefs or db
private boolean checkWifi;
// colors
private static final int COLOR_OFF = R.color.white;
private static final int COLOR_ON = R.color.lightyellow;
// icons
private static final int IC_WIFI_OFF = R.drawable.ic_wifi_off;
private static final int IC_WIFI_ON = R.drawable.ic_wifi_on;
//...
@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   //...
   tvWifi = (TextView) findViewById(R.id.wifi_onoff);
   // get saved wifi status from db
   checkWifi = ... 
   setWifi(checkWifi);
}

//...

/** onclick handler */
public void toggleWifi(View view) {

  //toggle
  setWifi( ! checkWifi);
}

/** Sets Wi-fi status + visual feedback */
private void setWifi(boolean onoff){

  tvWifi.setCompoundDrawablesWithIntrinsicBounds( 
    onoff ? 
    IC_WIFI_ON : 
    IC_WIFI_OFF, 
    0, 0, 0 );

  tvWifi.setTextColor( onoff ? 
                       getResources().getColor(COLOR_ON) : 
                       getResources().getColor(COLOR_OFF));

  // process.. enable or not 
  WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
  wifi.setWifiEnabled(onoff);
}

//...
@Override
protected void onPause() {
  super.onPause(); 
  // save checkWifi flag in db
  //...
}

//...

我们可以根据需要在多个字段中执行类似的操作:

Android开发实现多位开关按钮 android 开关_java_04

注意,我们在XML布局中定义onClick()时使用了View.onClickListener 。 我们本来可以使用View.OnTouchListener

// Activity now implements View.OnTouchListener
@Override 
public void onCreate(Bundle savedInstanceState) { 
   //...
   tvWifi.setOnTouchListener(this); 
}
//...
@Override 
public boolean onTouch(View v, MotionEvent event) { 
   // handle event here ...
   return true;
}

onClickonTouch有什么区别 ? 没有太多在这个特殊的使用情况下,由于我们并不需要额外的花哨的东西,我们可以用onTouchMotionEvent就做。

此技术只是开/关切换的另一种方法。 我们还可以通过某种动画轻松地对其进行增强。 是否比常规开关“更好”,主要是口味问题。 它是一种“非标准”(无论意味着什么),但是,另一方面,它可以为设计人员提供更多的自由和能力来创建自己的原始UI。 编码愉快!

翻译自: https://www.javacodegeeks.com/2014/11/android-tips-onoff-toggle.html