在TextView和EditText之间切换

时间:2010-09-03 17:35:04

标签: java android android-edittext textview

是否可以交换TextView和EditText。就像在需要时显示文本一样,但允许在需要时进行编辑。是否存在编辑TextView或不编辑EditText的方法(如NON-XML)?

4 个答案:

答案 0 :(得分:5)

  

是否可以交换TextView和EditText。

将两者放在同一位置的布局中。让一个看不见。根据需要切换可见性。

或者,将两者都作为ViewSwitcherViewFlipper的子项,并使用它们在它们之间切换。

  

是否存在编辑TextView或不编辑EditText的方法(如NON-XML)?

不,AFAIK。

答案 1 :(得分:1)

是的,事实上,根据EditText代码:

  

EditText是一个基于TextView的薄贴面,它将自身配置为   可编辑的。

非常瘦!您基本上可以说TextViewEditText,配置为不可编辑。 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());
    }
}

答案 2 :(得分:0)

EditTextTextView的子类。如果要禁用EditText的编辑功能,只需将inputType设置为"none",它将像TextView一样。

答案 3 :(得分:0)

我创建了一些方法,您可以在需要时利用它们进行适当的转换。希望对大家有帮助。

class AppDelegate: UIResponder, UIApplicationDelegate, SKPaymentTransactionObserver {

func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    
}

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    UIApplication.shared.isIdleTimerDisabled = true
    FirebaseApp.configure()
    IAPService.shared.getProducts()
    SKPaymentQueue.default().add(self)
    //Load game texts from FireBase
    return true
}}

您可以利用这些方法在EditText和AppCompatEditText(Androidx)的查看和编辑模式之间切换。