접근 가능한 앱을 개발 중입니다. 이를 위해 인터페이스의 모든 요소가 Talckback으로 읽을 수 있도록 포커스를 올바르게 얻을 수 있어야합니다. 이 질문에 Preference List only shows first elementListView에서 포커스가 예상대로 작동하지 않습니다.
그것은 터치 모드에서 완벽하게 작동처럼 나는, 내부 ListView
와 PreferenceActivity
을 구축,하지만 난 활성화 Talckback와 ListView
에 액세스하려고 할 때 (나는 ListView
집중 가려고 것입니다) , 그것은 내가 예상했던 것처럼 작동하지 않습니다. 나는 목록의 자식들이 초점을 가지기를 원한다. 전체 목록이 초점을 얻지는 않는다. 내 PreferenceActivity
내부
내가 추가 문제가
ListViews
스크롤을 가지고 있으며, 스크롤이 제대로 작동하지 않습니다.
ListView
을 스크롤 할 수 없게 할 수 있습니까?
감사
코드 :
ListPreferences.java (사용자의 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 (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