我想知道是否有现成的文本区域视图植入,随着用户键入更多文本而扩展。就像安卓内置的短信文本区域一样。
问问题
151 次
1 回答
0
我得到了部分答案:) - 我也需要一个 SMS 样式文本字段,所以我自己做了一个,包括一个跟踪剩余字符数的文本观察器。
这就是它的样子:
文本观察器实现
public class SMSTextWatcher implements TextWatcher {
private final int maxLength;
private final int stringId;
private final TextView textView;
/**
* @param maxLength maximum number of characters that are allowed
* @param stringId must have at least one %s in it, for the updated character count.
* @param targetView target text view that displays the number of characters left.
*/
public SMSTextWatcher(int maxLength, int stringId, TextView targetView) {
this.maxLength = maxLength;
this.textView = targetView;
this.stringId = stringId;
updateTextView(maxLength);
}
@Override
public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable editable) {
//Update textview (the limit is handled by the maxLength attribute)
updateTextView(maxLength - editable.length());
}
public void updateTextView(int charactersLeft) {
textView.setText(String.format(textView.getContext().getString(stringId), charactersLeft));
}
}
布局 XML - 我们称之为 widget_sms_field.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/sms_field_text"
style="@style/TextAppearance.AppCompat.Large"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:hint="@string/short_text"
android:imeOptions="actionSend|flagNoEnterAction"
android:inputType="textShortMessage|textAutoCorrect|textCapSentences|textMultiLine"
android:maxLength="@integer/sms_text_max_length"
android:paddingRight="10dp"
android:singleLine="false" />
<TextView
android:id="@+id/sms_field_remaining_characters"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="right"
android:text="@string/remaining_characters"
android:textColor="@color/secondary_text" />
</LinearLayout>
最大长度
在上面的布局文件中,我们使用了 android:maxLength="@integer/sms_text_max_length"
要解决它,我们必须在项目的 values 文件夹中创建一个名为“integer.xml”的文件。该文件的内容应如下所示:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="sms_text_max_length" type="integer">160</item>
</resources>
如果您将文件命名为“整数”以外的名称 - 请确保也相应地更改 @integer/sms_text...。
“剩余 x 个字符”文本
id 为 sms_field_remaining_characters 的灰色小文本字段(@color/secondary_text - 您需要自己创建此颜色!)是显示剩余字符数的字段。为此,创建一个新的字符串资源:
<string name="remaining_characters">%s remaining Characters</string>
在您自己的布局中包含小部件布局 xml,并在您的 Fragment 的 onViewCreated 方法中将 SMSTextWatcher 链接到我们的 sms 样式字段:
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
EditText textField = (EditText) view.findViewById(R.id.sms_field_text);
textField.addTextChangedListener(new SMSTextWatcher(
getResources().getInteger(R.integer.sms_text_max_length),
R.string.remaining_characters,
(TextView) view.findViewById(R.id.sms_field_remaining_characters)));
}
完毕 :) !如果您有任何问题或建议,请告诉我!
于 2015-05-28T15:04:01.887 回答