Фокус не работает должным образом в ListView

Я разрабатываю доступное приложение. Для этого важно, чтобы все элементы интерфейса могли правильно получить фокус, чтобы их можно было прочитать Talckback. Я создаю PreferenceActivity с ListView внутри, как и в этом вопросе. Список предпочтений показывает только первый элемент

Он работает идеально в режиме касания, но когда я пытаюсь получить доступ к ListView с активированным Talckback (это похоже на попытку получить Focused ListView ), он не работает, как я ожидал. Я хочу, чтобы дети из списка попадали в фокус, а не весь список фокусируется.

Введите описание изображения здесьВведите описание изображения здесь

У меня есть дополнительная проблема, у двух ListViews внутри моей PreferenceActivity есть прокрутка, и прокрутка работает неправильно. Могу ли я сделать ListView без прокрутки?

благодаря

Код:

ListPreferences.java (Custom ListView)

 import com.battleship.R; import android.content.Context; import android.content.SharedPreferences; import android.preference.Preference; import android.util.AttributeSet; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.OnHierarchyChangeListener; import android.widget.ArrayAdapter; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.RadioGroup.OnCheckedChangeListener; import android.widget.Toast; public class ListPreferences extends Preference implements OnCheckedChangeListener, OnHierarchyChangeListener { private ListView listView; private View thisView; private int listHeight = 0; public ListPreferences(Context context) { super(context); } public ListPreferences(Context context, AttributeSet attrs) { super(context, attrs); } public ListPreferences(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onClick() { super.onClick(); Toast t = Toast.makeText(getContext(), "HOLA!", 3); t.show(); } @Override protected View onCreateView(ViewGroup parent) { this.setLayoutResource(R.layout.listview_preference_layout); thisView = super.onCreateView(parent); listView = (ListView) thisView.findViewById(android.R.id.list); listView.setOnHierarchyChangeListener(this); String[] contentString = new String[3]; if (getKey().equals("theme")) { contentString = new String[] { (getContext().getString(R.string.settings_theme_default)), (getContext().getString(R.string.settings_theme_black)), (getContext().getString(R.string.settings_theme_white)) }; } else { contentString = new String[] { (getContext().getString(R.string.settings_font_big)), (getContext().getString(R.string.settings_font_medium)), (getContext().getString(R.string.settings_font_little)) }; } ArrayAdapter<String> array = new ArrayAdapter<String>(getContext(), android.R.layout.simple_list_item_single_choice, android.R.id.text1, contentString); listView.setAdapter(array); listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); listView.setFocusable(false); listView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS); return thisView; } private void updatePreference(int intRadio) { SharedPreferences.Editor editor = getEditor(); editor.putInt(getKey(), intRadio); editor.commit(); } @Override public void onCheckedChanged(RadioGroup group, int checkedId) { updatePreference(checkedId); notifyChanged(); } @Override public void onChildViewAdded(View parent, View child) { int childHeight = child.getMeasuredHeight(); if(childHeight > 0) { listHeight = listView.getAdapter().getCount() * childHeight; thisView.setMinimumHeight(listHeight); Log.i("LISTA","onChildViewAdded, done: "+listHeight+" "+childHeight); } } public void onChildViewRemoved(View parent, View child) { } } 

Preference.xml (xml of PreferenceActivity)

 <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > <PreferenceCategory android:key="player_settings" android:title="@string/settings_player_config" > <EditTextPreference android:defaultValue="@string/settings_player_default_name" android:dialogMessage="@string/settings_player_summary" android:dialogTitle="@string/settings_playersname" android:key="player_name" android:summary="@string/settings_player_summary" android:title="@string/settings_playersname" /> </PreferenceCategory> <PreferenceCategory android:key="volume" android:title="@string/settings_volume" > <com.battleship.preferences.SeekBarPreferences android:defaultValue="50" android:key="volume" android:title="@string/settings_volume" /> </PreferenceCategory> <PreferenceCategory android:key="shine" android:title="@string/settings_shine" > <com.battleship.preferences.SeekBarPreferences android:defaultValue="50" android:key="shine" android:title="@string/settings_shine" /> </PreferenceCategory> <PreferenceCategory android:key="themeTitle" android:title="@string/settings_group_themes" > <com.battleship.preferences.ListPreferences android:key="theme" /> </PreferenceCategory> <PreferenceCategory android:key="fontsTitle" android:title="@string/settings_group_font_size" > <com.battleship.preferences.ListPreferences android:key="font" /> </PreferenceCategory> </PreferenceScreen> 

SettingsActivity.java (PreferenceActivity)

 package com.battleship; import com.battleship.R; import android.os.Bundle; import android.preference.PreferenceActivity; import android.util.Log; import android.view.MotionEvent; import android.view.View; public class SettingsActivity extends PreferenceActivity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); } @Override public View getCurrentFocus() { Log.d("FOCO", "" + super.getCurrentFocus()); return super.getCurrentFocus(); } @Override public boolean onTrackballEvent(MotionEvent event) { Log.d("TRACKBALL", "" + event); return super.onTrackballEvent(event); } } 

 import com.battleship.R; import android.content.Context; import android.content.SharedPreferences; import android.preference.Preference; import android.util.AttributeSet; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.OnHierarchyChangeListener; import android.widget.ArrayAdapter; import android.widget.LinearLayout; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.RadioGroup.OnCheckedChangeListener; import android.widget.Toast; public class ListPreferences extends PreferenceCategory implements OnPreferenceClickListener, OnPreferenceChangeListener{ private final String TAG = getClass().getSimpleName(); private final Context mContext; private PreferenceScreen parentScreen; private View thisView; public FilterPreferenceCategory(Context context) { super(context); mContext = context; } public FilterPreferenceCategory(Context context, PreferenceScreen preferenceScreen) { super(context); mContext = context; parentScreen = preferenceScreen; } @Override protected View onCreateView(ViewGroup parent) { this.setLayoutResource(R.layout.rb_group_layout); Log.i(TAG, "onCreateView"); if(thisView == null) { thisView = super.onCreateView(parent); RadioGroup radioGroup = (RadioGroup) thisView.findViewById(R.id.radioGroup); final String[] contentString = getKey().equals("theme") ? mContext.getResources().getStringArray(R.array.theme_stuff) : mContext.getResources().getStringArray(R.array.font_stuff); int i; for(i = 0; i < contentString.length; i++) { RadioButton radioButton = new RadioButton(mContext); radioButton.layout(0, 0, 0, 0); radioButton.setFocusable(true); radioButton.setFocusableInTouchMode(true); radioButton.setOnClickListener(this); radioButton.setText(contentString[i]); radioGroup.addView(radioButton); } } return thisView; } public boolean onPreferenceChange(Preference preference, Object newValue) { Log.i(TAG, "onPreferenceChange"); return false; } public boolean onPreferenceClick(Preference preference) { Log.i(TAG,"onPreferenceClick"); return false; } @Override protected void onAttachedToActivity() { Log.i(TAG,"onAttachedToActivity"); super.onAttachedToActivity(); } public void onClick(View v) { v.requestFocus(); v.requestFocusFromTouch(); } } 

Рез / макет / rb_group_layout.xml:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="10dp" android:background="#000000" android:weightSum="2" > <LinearLayout android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_gravity="top" android:orientation="vertical" android:gravity="center" android:paddingRight="10dp" > <TextView android:id="@android:id/summary" style="@android:style/TextAppearance.Medium" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:paddingBottom="5dp" /> <TextView android:id="@android:id/summary" style="@android:style/TextAppearance.Small" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" /> </LinearLayout> <RadioGroup android:id="@+id/radioGroup" android:layout_weight="1" android:layout_width="match_parent" android:layout_height="fill_parent" > </RadioGroup> </LinearLayout> 

Рез / значения / arrays.xml:

 <?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="theme_stuff"> <item>@string/settings_theme_default</item> <item>@string/settings_theme_black</item> <item>@string/settings_theme_white</item> </string-array> <string-array name="font_stuff"> <item>@string/settings_font_big</item> <item>@string/settings_font_medium</item> <item>@string/settings_font_little</item> </string-array> </resources>