Фокусируемый EditText внутри ListView - PullRequest
120 голосов
/ 21 апреля 2010

Пока я потратил около 6 часов на это, и ничего не делал, кроме блокпостов.Общая предпосылка заключается в том, что в ListView есть некоторая строка (независимо от того, сгенерирована ли она адаптером или добавлена ​​в качестве представления заголовка), которая содержит виджет EditText и Button.Все, что я хочу сделать, это уметь использовать джогбол / стрелки, чтобы перемещать селектор по отдельным элементам, как обычно, но когда я добираюсь до определенной строки - даже если мне нужно явно идентифицировать строку - которая имеет фокусируемыйДитя, я хочу, чтобы этот ребенок сфокусировался, а не указывал положение селектором.

Я испробовал много возможностей, и до сих пор не получилось.

макет:

<ListView
    android:id="@android:id/list" 
    android:layout_height="fill_parent" 
    android:layout_width="fill_parent"
    />

Вид заголовка:

EditText view = new EditText(this);
listView.addHeaderView(view, null, true);

Предполагая, что в адаптере есть другие элементы, использование клавиш со стрелками будет перемещать выбор вверх / вниз в списке, как и ожидалось;но когда вы попадаете в строку заголовка, она также отображается с помощью селектора, и невозможно фокусироваться на EditText с помощью джогбола.Примечание: при нажатии EditText будет фокусироваться на этом месте, однако это зависит от сенсорного экрана, что не является обязательным требованием.

ListView, по-видимому, имеет два режима в этомОбратите внимание:
1. setItemsCanFocus(true): селектор никогда не отображается, но EditText может получить фокус при использовании стрелок.Алгоритм поиска фокуса трудно предсказать, и нет никакой визуальной обратной связи (по любым строкам: наличие фокусируемых дочерних элементов или нет) о том, какой элемент выбран, и то и другое может дать пользователю неожиданный опыт.
2. setItemsCanFocus(false): селекторвсегда рисуется в режиме без касания, и EditText никогда не может сфокусироваться - даже если вы нажмете на него.

Что еще хуже, вызов editTextView.requestFocus() возвращает true, но на самом деле это не таксфокусировать EditText.

То, что я предполагаю, в основном представляет собой гибрид 1 & 2, где вместо настройки списка, если все элементы являются фокусируемыми или нет, я хочу установить фокусируемостьдля одного элемента в списке, чтобы селектор плавно переходил от выбора всей строки для нефокусируемых элементов и обхода дерева фокуса для элементов, содержащих фокусируемые дочерние элементы.

Любойберущая

Ответы [ 12 ]

0 голосов
/ 05 декабря 2012

Самая важная часть - заставить focus работать на ячейку списка. Специально для списка на Google TV это важно:

setItemsCanFocus метод представления списка делает свое дело:

...
mPuzzleList = (ListView) mGameprogressView.findViewById(R.id.gameprogress_puzzlelist);
mPuzzleList.setItemsCanFocus(true);
mPuzzleList.setAdapter(new PuzzleListAdapter(ctx,PuzzleGenerator.getPuzzles(ctx, getResources(), version_lite)));
...

Мой список xml начинается следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:id="@+id/puzzleDetailFrame"
             android:focusable="true"
             android:nextFocusLeft="@+id/gameprogress_lessDetails"
             android:nextFocusRight="@+id/gameprogress_reset"
...

nextFocusLeft / Right также важны для навигации по D-Pad.

Для более подробной информации, ознакомьтесь с другими замечательными ответами.

0 голосов
/ 04 октября 2011

Другое простое решение - определить ваш onClickListener в методе getView (..) вашего ListAdapter.

public View getView(final int position, View convertView, ViewGroup parent){
    //initialise your view
    ...
    View row = context.getLayoutInflater().inflate(R.layout.list_item, null);
    ...

    //define your listener on inner items

    //define your global listener
    row.setOnClickListener(new OnClickListener(){
        public void onClick(View v) {
            doSomethingWithViewAndPosition(v,position);
        }
    });

    return row;

Таким образом, ваша строка кликабельна, и ваш внутренний вид тоже:)

...