2012-03-28 11 views
6

私はアクセス可能なアプリケーションを開発中です。この目的のためには、インタフェースのすべての要素がTalckbackによって読み取られるように、フォーカスを正しく取得できることが重要です。この質問にPreference List only shows first elementListViewでフォーカスが期待通りに機能しない

それはタッチモードで完璧に動作するように 私は、内部ListViewPreferenceActivityを構築し、私はアクティブにTalckbackとListViewにアクセスしようとすると、(私はListView重視取得しようとするようなものです) 、私は期待どおりに動作しません。私はリストの子供たちがフォーカスを得るようにしたい、リスト全体がフォーカスを得ないようにする。

enter image description hereenter image description here


私は別の問題を持って、私の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); 
    } 

} 
+0

リストビュー内のリストビューが機能しません。内側のリストビューをLinearLayoutに置き換えます。 – WarrenFaith

+0

'setFocusableInTouchMode(true)'を使用しようとしていますか? –

+0

私はLinearLayaoutで試してみましたが、同じ結果が得られましたが、インターフェイスが悪いと、LinearLayoutでフォーカスの適切な機能を得ることができますが、私はそれを変更しますが、今のところそれはありません。 – Mun0n

答えて

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> 
+0

またはそれらの行に沿って何かが動作します –

+0

あなたは神です.....私はそれをやろうとします...ありがとう! – Mun0n

+0

それは私にいくつかの誤りを与える。 radioButton.setOnClickListener(this)の1つ。私は正しいことを実現していると確信しています。 ?? 。しかし、主なエラーは、私がアプリケーションを実行しようとすると、それはレイアウトの膨張で私にエラーを与える、私は理由を知らない。レイアウトでTextViewを作成する必要はありません、私はラジオグループを表示したいだけです – Mun0n

関連する問題