[英]Switch between a TextView and EditText
這是否可以互換 TextView 和 EditText。 喜歡在需要時顯示文本,但在需要時允許編輯。 是否有編輯 TextView 或非編輯 EditText 的方法(如在非 XML 中)?
這是否可以互換 TextView 和 EditText。
將兩者放在您的布局中的同一位置。 讓一個隱形。 根據需要切換可見性。
或者,將兩者都作為ViewSwitcher
或ViewFlipper
,並使用它在它們之間切換。
是否有編輯 TextView 或非編輯 EditText 的方法(如在非 XML 中)?
不,阿法克。
是的,其實根據EditText
代碼:
EditText 是 TextView 上的一個薄飾面,將自身配置為可編輯。
而且非常薄! 您基本上可以說TextView
是配置為不可編輯的EditText
。 EditText
的代碼太短了,我把它放在這個問題的底部以供參考。
唯一真正的區別在於在 XML 中設置的樣式:
<style name="Widget.EditText">
<item name="android:focusable">true</item>
<item name="android:focusableInTouchMode">true</item>
<item name="android:clickable">true</item>
<item name="android:background">?android:attr/editTextBackground</item>
<item name="android:textAppearance">?android:attr/textAppearanceMediumInverse</item>
<item name="android:textColor">?android:attr/editTextColor</item>
<item name="android:gravity">center_vertical</item>
</style>
您可以使用以下方法將它們重置為 java 中的TextView
值:
mEditView.setFocusable(false);
mEditView.setFocusableInTouchMode(false);
mEditView.setClickable(false);
mEditView.setBackground(null); // Or setBackgroundDrawable() on early APIs.
mEditView.setTextAppearance(mEditView.getContext(), android.R.attr.textAppearanceSmall);
mEditView.setTextColor(Color.BLACK); // I'm not sure how to get the default here.
mEditView.setGravity(Gravity.TOP | Gravity.START);
您可能不想更改所有這些,例如,可能會保留重力和文本顏色/外觀,因此事情不會突然發生奇怪的變化。
EditText
代碼public class EditText extends TextView {
public EditText(Context context) {
this(context, null);
}
public EditText(Context context, AttributeSet attrs) {
this(context, attrs, com.android.internal.R.attr.editTextStyle);
}
public EditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected boolean getDefaultEditable() {
return true;
}
@Override
protected MovementMethod getDefaultMovementMethod() {
return ArrowKeyMovementMethod.getInstance();
}
@Override
public Editable getText() {
return (Editable) super.getText();
}
@Override
public void setText(CharSequence text, BufferType type) {
super.setText(text, BufferType.EDITABLE);
}
/**
* Convenience for {@link Selection#setSelection(Spannable, int, int)}.
*/
public void setSelection(int start, int stop) {
Selection.setSelection(getText(), start, stop);
}
/**
* Convenience for {@link Selection#setSelection(Spannable, int)}.
*/
public void setSelection(int index) {
Selection.setSelection(getText(), index);
}
/**
* Convenience for {@link Selection#selectAll}.
*/
public void selectAll() {
Selection.selectAll(getText());
}
/**
* Convenience for {@link Selection#extendSelection}.
*/
public void extendSelection(int index) {
Selection.extendSelection(getText(), index);
}
@Override
public void setEllipsize(TextUtils.TruncateAt ellipsis) {
if (ellipsis == TextUtils.TruncateAt.MARQUEE) {
throw new IllegalArgumentException("EditText cannot use the ellipsize mode "
+ "TextUtils.TruncateAt.MARQUEE");
}
super.setEllipsize(ellipsis);
}
@Override
public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
super.onInitializeAccessibilityEvent(event);
event.setClassName(EditText.class.getName());
}
@Override
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(info);
info.setClassName(EditText.class.getName());
}
}
EditText
是TextView
的子TextView
。 如果您想禁用EditText
的編輯功能,您可以簡單地將inputType
設置為"none"
,它將表現為TextView
。
我創建了一些方法,您可以利用它們在需要時進行適當的轉變。 希望這會幫助大家。
//Code for reference
public static void setViewingMode(final AppCompatEditText mEditView) {
mEditView.setFocusable(false);
mEditView.setFocusableInTouchMode(false);
mEditView.setClickable(false);
int sdk = android.os.Build.VERSION.SDK_INT;
if (sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
mEditView.setBackgroundDrawable(null);
} else {
mEditView.setBackground(null);
}
}
public static void setEditingMode(final AppCompatEditText mEditView, final Context context) {
mEditView.setFocusable(false);
mEditView.setFocusableInTouchMode(false);
mEditView.setClickable(false);
mEditView.setBackground(null);
AppCompatEditText et = new AppCompatEditText(context);
int sdk = android.os.Build.VERSION.SDK_INT;
if (sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
mEditView.setBackgroundDrawable(et.getBackground());
} else {
mEditView.setBackground(et.getBackground());
}
}
您可以利用這些方法在 EditText 和 AppCompatEditText (Androidx) 的查看和編輯模式之間切換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.