SpannableString 转换局部字体大小,但在EditText测量之前设置内容,测量高度为,字体变小之前的高度

SpannableString 转换局部字体大小,但在EditText测量之前设置内容,测量高度为,字体变小之前的高度

复制代码
  public void setHint(@NonNull String hint, @Nullable CharSequence subHint) {
    this.hint = hint;

    if (subHint != null) {
      this.subHint = new SpannableString(subHint);
      this.subHint.setSpan(new RelativeSizeSpan(0.5f), 0, subHint.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
    } else {
      this.subHint = null;
    }



    if (this.subHint != null) {
      //如果打开注释,在chathead布局中,每次*次绘画布局时,输入框高度都会比下次绘制时高,原因可能是
//      这行转换字符大小的代码在onLayout执行之前字符变小测量的高度为变小之前的高度,显示时造成布局高度增高this.subHint.setSpan(new RelativeSizeSpan(0.5f), 0, subHint.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
      if(isOnLayout){
        super.setHint(new SpannableStringBuilder().append(ellipsizeToWidth(this.hint))
            .append("\n")
            .append(ellipsizeToWidth(this.subHint)));
    //  *次测量结果为两行默认字体高度  ,第二次测量为*行默认高度,第二话一半默认高度
      }

    } else {
      super.setHint(ellipsizeToWidth(this.hint));
    }
  }
复制代码

SpannableString 转换局部字体大小,但在EditText测量之前设置内容,测量高度为,字体变小之前的高度

EditText限制输入字符类型的几种方式

EditText限制输入字符类型的几种方式

   *近的项目上需要限制EditText输入字符的类型,就把可以实现这个功能的方法整理了一下:

1、*种方式是通过EditText的inputType来实现,可以通过xml或者Java文件来设置。假如我要设置为显示密码的形式,可以像下面这样设置:

在xml中,   Android:inputType=”textPassword”

在java文件中,可以用 myEditText.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

当然,还有更多的其他属性用来进行输入设置。

 

2、第二种是通过android:digits 属性来设置,这种方式可以指出要显示的字符,比如我要限制只显示数字,可以这样:

android:digits=”0123456789″

如果要显示的内容比较多,就比较麻烦了,将要显示的内容依次写在里面。

3、通过正则表达式来判断。下面的例子只允许显示字母、数字和汉字。

public static String stringFilter(String str)throws PatternSyntaxException{
// 只允许字母、数字和汉字
String   regEx  =  “[^a-zA-Z0-9\u4E00-\u9FA5]”;
Pattern   p   =   Pattern.compile(regEx);
Matcher   m   =   p.matcher(str);
return   m.replaceAll(“”).trim();
}

然后需要在TextWatcher的onTextChanged()中调用这个函数,

@Override
public void onTextChanged(CharSequence ss, int start, int before, int count) {
String editable = editText.getText().toString();
String str = stringFilter(editable.toString());
if(!editable.equals(str)){
editText.setText(str);
//设置新的光标所在位置
editText.setSelection(str.length());
}
}

 

4、通过InputFilter来实现。

 

实现InputFilter过滤器,需要覆盖一个叫filter的方法。

public abstract CharSequence filter (

CharSequence source,  //输入的文字

int start,  //开始位置

int end,  //结束位置

Spanned dest, //当前显示的内容

int dstart,  //当前开始位置

int dend //当前结束位置

);

下面的实现使得EditText只接收字符(数字、字母和汉字)和“-”“_”,Character.isLetterOrDigit会把中文也当做Letter。

editText.setFilters(new InputFilter[] {

new InputFilter() {
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
            for (int i = start; i < end; i++) {
                    if ( !Character.isLetterOrDigit(source.charAt(i)) && !Character.toString(source.charAt(i)) .equals(“_”) && !Character.toString(source.charAt(i)) .equals(“-“)) {
                            return “”;
                    }
            }
            return null;

}  });

 

另外使用InputFilter还能限制输入的字符个数,如

EditText tv =newEditText(this);
int maxLength =10;
InputFilter[] fArray =new InputFilter[1];
fArray[0]=new  InputFilter.LengthFilter(maxLength);
tv.setFilters(fArray);

上面的代码可以限制输入的字符数*大为10。

初始加载时edittext不自动获取焦点的方法

在做一个搜索功能时,刚进入界面,edittext直接自动获取焦点,这显然不是我想要的。

那么问题来了:如何关闭EditText自动获取焦点的?

尝试了好几个方法,在Java代码添加focus控制,在xml文件中的EditText控件中添加focusable约束等,都不适用于我的这个问题。

 

解决办法:在xml文件中EditText外框架里添加上android:focusable=”true” android:focusableInTouchMode=”true”,这样问题就解决了。

 

[html] view plain copy
  1. <RelativeLayout    
  2.         android:id=“@+id/title”    
  3.         android:layout_width=“fill_parent”    
  4.         android:layout_height=“wrap_content”    
  5.         android:layout_alignParentLeft=“true”    
  6.         android:layout_alignParentRight=“true”    
  7.         android:layout_alignParentTop=“true”    
  8.         android:background=“#F8F8FF”    
  9.         android:focusable=“true”    
  10.         android:focusableInTouchMode=“true”    
  11.         android:paddingBottom=“6dp” >    
  12.         <EditText    
  13.             android:id=“@+id/search”    
  14.             android:layout_width=“wrap_content”    
  15.             android:layout_height=“wrap_content”    
  16.             android:layout_alignParentLeft=“true”    
  17.             android:layout_marginLeft=“10dp”    
  18.             android:layout_marginRight=“5dp”    
  19.             android:layout_marginTop=“5dp”    
  20.             android:layout_toLeftOf=“@+id/auto_add”    
  21.             android:background=“@drawable/rounded_edittext”    
  22.             android:drawableLeft=“@drawable/search”    
  23.             android:ems=“10”    
  24.             android:hint=“@string/hint_search”    
  25.             android:imeOptions=“actionSearch”    
  26.             android:inputType=“text”    
  27.             android:singleLine=“true”    
  28.             android:textSize=“15sp” >    
  29.         </EditText>   

 

Android BMI体质计算器实现

本文源于安卓基础,主要介绍如何实现BMI体质计算器。

先讲规则后讲实现

体质计算规则

胖瘦程度

体质指数

过轻

男性低于20,女性低于19

适中

男性20-25,女性19-24

超重

男性25-30,女性24-29

肥胖

男性30-35,女性29-34

严重肥胖

男性高于35,女性高于34

测试效果

案例打印出保留两位BMI指数,并且对于身高体重小于0,异常不处理!

实例步骤

创建项目My eleApplication

点进Project—>Empty Activity—>然后名字改下,finish即可。成功之后,点击箭头运行程序。

程序正常可以跑成功hello world字样,下面我们继续

布局activity_main.xml

大家从实验效果可以看出,这里用了不少控件。三个TextView,两个EditText,两个单选按钮控件,一个按钮控件,代码下方对内容作进一步分析!

xmlns:app=”http://schemas.android.com/apk/res-auto”

xmlns:tools=”http://schemas.android.com/tools”

android:layout_width=”match_parent”

android:layout_height=”match_parent”

android:orientation=”vertical”>

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:text=”身高(cm)”

android:id=”@+id/txt1″/>

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:id=”@+id/edX”/>

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:text=”体重(kg)”

android:id=”@+id/txt2″/>

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:id=”@+id/edY”/>

android:layout_width=”match_parent”

android:layout_height=”wrap_content”

android:orientation=”horizontal”

android:id=”@+id/rg”>

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:text=”男”

android:id=”@+id/rb1″

android:layout_marginRight=”30dp”

android:checked=”true”/>

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:text=”女”

android:id=”@+id/rb2″

/>

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:id=”@+id/btn”

android:text=”计算BMI值”/>

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:id=”@+id/tvResult”/>

LinearLayout详解

这是基础的线性布局,只需要配置width与height。水平方向即可

TextView详解

我们用了三个,其中一个是输出结果,另外两个只是为了代码更友好。具体的也是基础设置。

RadioButton详解

要想使用单选按钮必须要设置按钮组,然后一些基本的配置,包括text,id,width与height。id是后期获得操作的。必须设置

EditText详解

很多时候,编辑文本是在初学者时期需要用到的。因此id必须设置

搭建MainActivity.java代码

java代码在完成这个案例时只需要三步,这也是翁恺老师经常说的三步:“输入-处理–输出”。输入就是指获取View种的所有对象。处理就是指能根据输入值找出判断依据,输出就是把答案抛出来。

package com.example.myeleapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.RadioButton;

import android.widget.TextView;

import org.w3c.dom.Text;

public class MainActivity extends Activity implements View.OnClickListener {
RadioButton rb1;

RadioButton rb2;

TextView tvResult;

EditText txt1;

EditText txt2;

Button btn;

@Override

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

setViews();

}

public void setViews() {
rb1 = (RadioButton) findViewById(R.id.rb1);

rb2 = (RadioButton) findViewById(R.id.rb2);//判断男女

tvResult = (TextView) findViewById(R.id.tvResult);

txt1 = (EditText)findViewById(R.id.edX);

txt2 = (EditText)findViewById(R.id.edY);

btn = (Button)findViewById(R.id.btn);

btn.setOnClickListener(this);

}

@Override

public void onClick(View v) {
double x = Double.parseDouble(txt1.getText().toString());//身高

double y = Double.parseDouble(txt2.getText().toString());//体重//体重除以身高的平方

double res;

String str = “Your BMI is”;

if(x<=0 || y<=0) {
tvResult.setText(“值异常,不计算”);

return ;

}

x = x/100;

res = y / (x*x);

String str1 = String.format(“%.2f”,res);

str = str + str1;

if(rb1.isChecked())

res -= 1;//以女性为标准进行比较

//仅以女性作为评价标准

str += “体型:”;

if(res < 19)

str += “过轻”;

else if(res < 24)

str += “适中”;

else if(res<29)

str += “超重”;

else if(res<34)

str += “肥胖”;

else

str += “严重肥胖”;

tvResult.setText(str);

}

}

点击运行,获取结果

总结

执念并在此总结了实例的步骤:

创建项目,跑通hello world

搭建界面

配置java代码

点击运行,收获喜悦

希望本文能帮助到大家!
————————————————

Android EditText输入框自动提示

所示的图片中输入as前两个字母,后面就会提示相应的结果提示,这在apidemo中也有类似例子的提供,网上传的也基本都是那个例子。
这个功能用处不大,但是在于新意不错,说专业一点就是用户体验不错。
每个事情都有缺点,这个的坏处就是必须输入两个以上的字符,两个!
实现此功能的是EditText的子类控件AutoCompleteTextView。既是子类,所以有着全部父类的属性,即用法与EditText相同。(MultiAutoCompleteTextView这个的属性更加强大,有兴趣的朋友可以继续研究)。

来看看功能实现代码

 

public class Enter extends Activity {

String[] result_about_a = {“andexplorer”,”astro”};
private AutoCompleteTextView field_text; // 定义AutoCompleteTextView对象

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

field_text = (AutoCompleteTextView) findViewById(R.id.et1);
//自动提示
ArrayAdapter<String> adapt = new ArrayAdapter<String>(this,
android.R.layout.simple_dropdown_item_1line,
result_about_a);
field_text.setAdapter(adapt);

}
}

xml布局部分

<AutoCompleteTextView
android:id=”@+id/et1″
android:hint=”软件,游戏,尽在96商城” // 此处为自己定义的属性,可不要。提示信息
android:layout_width=”220px”
android:layout_height=”50px”
android:layout_marginLeft=”30px”
>

但是,此方法的一个*大不好处就是上面的数组自定义。这个简直就是愚蠢的做法,应该可以在创建一个数据库用来存放一些被搜索的内容,然后等用到的时候再用Adapter来相应的对应上,但是自己还没那样做。还是惰性太大啊。希望有此经验的朋友有机会可以给我一些建议。