私はアクセス可能なアプリケーションを開発中です。この目的のためには、インタフェースのすべての要素がTalckbackによって読み取られるように、フォーカスを正しく取得できることが重要です。この質問にPreference List only shows first elementListViewでフォーカスが期待通りに機能しない
それはタッチモードで完璧に動作するように 私は、内部ListView
とPreferenceActivity
を構築し、私はアクティブにTalckbackとListView
にアクセスしようとすると、(私はListView
重視取得しようとするようなものです) 、私は期待どおりに動作しません。私はリストの子供たちがフォーカスを得るようにしたい、リスト全体がフォーカスを得ないようにする。
私は別の問題を持って、私のPreferenceActivity
内部の2 ListViews
は、スクロールを持っており、スクロールが正しく動作しません。 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(PreferenceActivityのXML)
<?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);
}
}
リストビュー内のリストビューが機能しません。内側のリストビューをLinearLayoutに置き換えます。 – WarrenFaith
'setFocusableInTouchMode(true)'を使用しようとしていますか? –
私はLinearLayaoutで試してみましたが、同じ結果が得られましたが、インターフェイスが悪いと、LinearLayoutでフォーカスの適切な機能を得ることができますが、私はそれを変更しますが、今のところそれはありません。 – Mun0n