Как сделать EditText только для чтения и копирования, но не для редактирования

Я хочу сделать окно редактирования только для чтения, но не редактируемым.

пользователь должен иметь возможность копировать из моего окна редактирования, но он не должен быть редактируемым пользователем ny.

пожалуйста, дайте мне знать, как это делать.

6 ответов


вы можете перезаписать прослушиватель ключей, поэтому вы можете делать что угодно, кроме редактирования

final EditText edittext = (EditText) findViewById(R.id.edittext);
edittext.setOnKeyListener(new OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        return true;
    }
});

команда text.setTextIsSelectable(true) требуется API 11. Для тех, кто использует более низкий API, используйте следующий XML:

android:inputType="none"
android:textIsSelectable="true"

это сделает ваш editText выбираемые, но не редактируется.


самый простой способ сделать это-добавить этот код:

textInput.setInputType(InputType.TYPE_NULL);
textInput.setTextIsSelectable(true);
textInput.setKeyListener(null);

создать TextView как было указано в другом ответе, вместо EditText. Затем переопределите контекстное меню Действия в вашем Activity класс, как показано ниже:

public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {

    menu.add(0, v.getId(), 0, "Copy");

    //cast the received View to TextView so that you can get its text
    TextView yourTextView = (TextView) v;

     //place your TextView's text in the clipboard
     ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
     clipboard.setText(yourTextView.getText());
}

тогда просто позвоните registerForContextMenu(yourTextView); на onCreate().


используйте свойство android: editable= "false" для EditText в файле представления макета.


Я использую этот класс

import android.content.Context;
import android.text.InputFilter;
import android.text.Spanned;
import android.util.AttributeSet;
import android.widget.EditText;

/*
 * 
 * To make EditText read and copy only but not editable
 * using
 *   sendReadOnlyCallback(callback);
 * 
 */
public class MyEditText extends EditText {

    private InputFilter[] originalFilters = null;
    private boolean internalChange = false;
    private InputFilter[] myInputFilters = null;
    private static ReadonlyCallback sDummyCallback = new ReadonlyCallback() {
        @Override
        public boolean isReadOnly() {
            return false;
        }
    };
    private ReadonlyCallback callback = sDummyCallback;

    public MyEditText(Context context) {
        super(context);
    }

    public MyEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public interface ReadonlyCallback {
        public boolean isReadOnly();
    }

    public void setReadonlyCallback(ReadonlyCallback cb) {
        if (cb == null)
            callback = sDummyCallback;
        else
            callback = cb;
    }

    public void setFilters(InputFilter[] filters) {

        // duplicated from TexView
        originalFilters = new InputFilter[filters.length];
        System.arraycopy(filters, 0, originalFilters, 0, filters.length);

        // funny No. 1 : have to re instantiate `callback`
        // otherwise got `NullPointerExcection` when called from `filter`
        callback = sDummyCallback;

        myInputFilters = new InputFilter[] { new InputFilter() {

            // funny No. 2:
            // have to make refs to `originalfilters`
            // otherwise got `NullPointerExcection` when called from `filter`
            InputFilter[] flts = originalFilters;

            @Override
            public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
                if (!internalChange && callback.isReadOnly())
                    return dest.subSequence(dstart, dend);
                int filtercount = flts.length;
                if (filtercount == 0)
                    return null;

                // duplicated from InputFilter.AllCaps
                for (int i = 0; i < filtercount; i++) {
                    CharSequence repl = flts[i].filter(source, start, end, dest, start, end);
                    if (repl != null) {
                        source = repl;
                        start = 0;
                        end = repl.length();
                    }
                    if (i == filtercount)
                        return repl;
                }
                return null;
            }
        } };
        super.setFilters(myInputFilters);
    }

    @Override
    public InputFilter[] getFilters() {
        if (myInputFilters == null)
            return super.getFilters();
        return originalFilters;
    }

    @Override
    public synchronized void setText(CharSequence text, BufferType type) {
        internalChange = true;
        super.setText(text, type);
        internalChange = false;
    }
}