我正在开发一个可访问的应用程序。为此,重要的是界面的所有元素都能正确获得焦点,以便Talckback可以读取它们。
我在PreferenceActivity
内置了ListView
,就像这个问题Preference List only shows first element
它在触摸模式下工作得很完美,但是当我尝试在启用Talckback的情况下访问ListView
时(就像我试图聚焦ListView
),它不像我一样工作预期。我希望列表中的孩子获得焦点,而不是整个列表获得焦点。
我还有一个问题,我ListViews
内的两个PreferenceActivity
有滚动条,滚动条无效。我可以使ListView
无法滚动吗?
由于
代码:
ListPreferences.java(自定义列表视图)
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(xpre 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);
}
}
答案 0 :(得分:2)
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();
}
}
RES /布局/ 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>
RES /值/ 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>