Jak replikovat androida: upravitelný = „false“ v kódu?

hlasů
39

V rozvržení můžete nastavit EditTextwidget, aby non-editovatelný přes android:editable attribute.

Jak se to dá udělat v kódu? Já třeba, aby EditTextwidget možné upravovat v závislosti na podmínkách.

Položena 18/03/2009 v 22:19
zdroj uživatelem
V jiných jazycích...                            


14 odpovědí

hlasů
37
editText.setFocusable(false);
editText.setClickable(false);

toto zajištění EditTextkontroly nemohou být vybrány a soustředěný, takže ji nelze editovat.

Odpovězeno 03/12/2010 v 02:41
zdroj uživatelem

hlasů
24

Jen jsem se snažil to,

Chcete-li zakázat editace textu:

.setFocusable(false);

to také stanovuje setFocusableInTouchMode na falešné!

Chcete-li povolit pro úpravu textu:

setFocusableInTouchMode(true);

to také stanovuje setFocusable na true;

Odpovězeno 14/02/2012 v 11:56
zdroj uživatelem

hlasů
15

Nejlepší způsob, jak toho dosáhnout, je s touto jediný řádek kódu:

textView.setKeyListener(null);

Tyto dokumenty říci tímto způsobem:

Nastaví klíč posluchače, který bude použit s tímto TextView. To může být null zakázat vstup uživatele.

Odpovězeno 15/06/2011 v 01:58
zdroj uživatelem

hlasů
12

Myslím, InputFilterže odmítá všechny změny je dobrým řešením:

editText.setFilters(new InputFilter[] {
    new InputFilter() {
        public CharSequence filter(CharSequence src, int start,
            int end, Spanned dst, int dstart, int dend) {
            return src.length() < 1 ? dst.subSequence(dstart, dend) : "";
        }
    }
});

Edit: dlazar navrhl (viz níže) změnit return, aby dst.subSequence(dstart, dend)k překonání chování, které odstraňuje slova.

Odpovězeno 26/05/2009 v 16:50
zdroj uživatelem

hlasů
6
android:editable="false" 
android:inputType="none" 

v XML nebo

EditText mEdit = (EditText) findViewById(R.id.yourid);
mEdit.setEnabled(false);

nebo

EditText mEdit = (EditText) findViewById(R.id.yourid);
mEdit.setKeyListener(null);
Odpovězeno 12/04/2013 v 06:14
zdroj uživatelem

hlasů
4

Můžete zkusit toto:

        mEditText.setFocusable(false);
        mEditText.setClickable(false);
        mEditText.setFocusableInTouchMode(false);
        mEditText.setLongClickable(false);
        mEditText.setInputType(InputType.TYPE_NULL);

To bude úplně vypnout EDITTEXT zakázat dlouhý stisk, pokud nechcete, aby uživatel otevřít editační možnosti textu.

Odpovězeno 18/07/2013 v 13:36
zdroj uživatelem

hlasů
3

[Vysílání novou odpověď, protože já nemohu komentovat Josefova odpověď.]

Vstupní filtr funguje dobře, ale má jemnou chyba v něm: psaní nad výběrem smaže veškerý text.

Řekněme například, že máte text "foo"v The EditText. Pokud si to všechno (např dvojitým kliknutím na něj) a typ vybrat 'a', text zmizí. Důvodem je, že InputFilterse bude jmenovat jako:

filter("a", 0, 1, "foo", 0, 3);

Navrhované vstupní filtr vrátí prázdný řetězec v tomto případě (protože src.length() < 1je false), což vysvětluje chybějící text.

Řešením je jednoduše vrátit dst.subSequence(dstart, dend)ve funkci filtru. To bude fungovat dobře i pro odstranění.

Odpovězeno 21/01/2010 v 21:51
zdroj uživatelem

hlasů
3

Už jste vyzkoušeli setText (java.lang.CharSequence, android.widget.TextView.BufferType) ? Je popsán jako:

Nastavuje text, který toto TextView je zobrazit (viz setText (CharSequence)) a rovněž stanoví, zda je uložena v styleable / spannable vyrovnávací paměti a zda je upravitelný .

(Důraz důl)

Odpovězeno 19/03/2009 v 16:03
zdroj uživatelem

hlasů
3

Nevidím způsob související pro tento atribut ve třídě EDITTEXT. Nicméně existují i jiné podobné věci, které můžete použít jako například android:focus/setFocusable(boolean)nebo vytvořit další TextView jejíž android:editable="false"a použít setVisiblilty()k přepínání mezi nastavitelnými a nelze upravovat zobrazení. Používáte-li View.GONEuživatel nebude nikdy vědět, že jsou dvě EditTexts.

Pokud váš pocit, ambiciózní, by pravděpodobně mohlo udělat něco s EDITTEXT své onTextChangedposluchače, jako má to reagují s setText.

Odpovězeno 19/03/2009 v 01:43
zdroj uživatelem

hlasů
1

hádám

Edittext.setEnabled(false); 

prostřednictvím kódu

a

android:enabled="false"

přes xml.Also zkontrolovat tento příspěvek v SO .

Měly by fungovat a můžete znovu povolit programatically Edittext.setEnabled(true);

Odpovězeno 08/01/2016 v 11:17
zdroj uživatelem

hlasů
1

Chtěl jsem se také poukázat na alternativní řešení, které funguje dobře, pokud se vytváření nových instancí EditView. Můžete přepsat metodu getDefaultEditable (), jak navrhuje docs vrátit false. Např

EditText view = new EditText(DiscountCalculator.this) {
    public boolean getDefaultEditable() {
        return false;
    }
};
Odpovězeno 11/12/2011 v 00:08
zdroj uživatelem

hlasů
0

Jediné řešení jsem našel v tomto scénáři je vytvoření 2 rozvržení. Jedním z nich je upravitelný a jednoho není. Možná se budete muset vytvořit více než 2 rozvržení založené na různých podmínkách. Ukládat podmínky SharedPreferences nebo jinými prostředky a zavést příslušnou rozložení na základě podmínek, po restartu aktivitu. Zde je příklad:

v onCreate () činnosti:

    configuration = new Configuration(this.getSharedPreferences(Configuration.SHARED_PREFERENCES_FILE_NAME, Context.MODE_PRIVATE));
    manualSettingsMode = configuration.isManualSettingsMode();
    if(manualSettingsMode){
        setContentView(R.layout.editableconfigurationsettings);
    }else {
        setContentView(R.layout.configurationsettings);
    }

Aktivita může být restartován na základě testování stavu a volání funkcí jako:

private void setManualEditing(){
    configuration.set_isManualSettingsMode(true);
    this.recreate();
}

private void setAutoEditing(){
    configuration.set_isManualSettingsMode(false);
    this.recreate();
}

Snad to pomůže. Tam opravdu musí být lepší řešení, ale to je to, co jsem dělal. V ideálním případě, jeden by měl být schopen to udělat na jednotlivé oblasti a nebudou se muset znovu načíst aktivity / rozvržení. -bobby

Odpovězeno 31/05/2013 v 18:12
zdroj uživatelem

hlasů
-1

Zkuste to:

 mEditText.setFilters(new InputFilter[]{new InputFilter() {
        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
            if (XXX) {
                return "";
            } else {
                return null;
            }
        }
    }});
Odpovězeno 12/04/2017 v 13:57
zdroj uživatelem

hlasů
-1

Myslím, že správný způsob, jak dosáhnout požadovaného efektu je:

mEditView.setText("my text", BufferType.NORMAL);

Chcete-li přepínat mezi upravitelné a non-editovatelné, můžete provést následující kroky:

// Switch to non-editable
mEditView.setText(mEditView.getText(), BufferType.NORMAL);

// Switch back to editable
mEditView.setText(mEditView.getText(), BufferType.EDITABLE);
Odpovězeno 14/12/2010 v 11:38
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more