2012-03-28 22 views
6

Sto sviluppando un'applicazione accessibile. Per questo scopo è importante che tutti gli elementi dell'interfaccia possano ottenere correttamente lo stato attivo, in modo che possano essere letti da Talckback. Costruisco una PreferenceActivity con un ListView dentro, come in questa domanda Preference List only shows first elementFocus non funziona come previsto in ListView

Funziona perfetto in modalità touch, ma quando provo ad accedere al ListView con il Talckback attivato (è come cerco di ottenere messi a fuoco la ListView) , Non funziona come mi aspettavo. Voglio che i bambini della lista ottengano l'attenzione, non l'intera lista viene messa a fuoco.

enter image description hereenter image description here


Ho un ulteriore problema, i due ListViews dentro la mia PreferenceActivity ha scorrimento, e il rotolo non funziona correttamente. Posso fare lo ListView no scrollable?

Grazie

Codice:

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 di 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

Un listview in una lista non funziona. Sostituisci la list list interna con un LinearLayout. – WarrenFaith

+0

prova a usare 'setFocusableInTouchMode (true)'? –

+0

Lo provo con un LinearLayaout e ottengo lo stesso risultato ma con un'interfaccia peggiore, se riesco a ottenere una corretta funzionalità dello stato attivo con LinearLayout, lo cambierò, ma per ora non lo fa. – Mun0n

risposta

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/layout/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> 

ris/Valori/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

O qualcosa del genere funzionerà –

+0

Sei un dio ..... cercherò di farlo ... grazie! – Mun0n

+0

Ouch. Mi dà alcuni errori. Uno in the RadioButton.setOnClickListener (this); Sono sicuro che sto facendo l'implementazione giusta. ?? . Ma l'errore principale, è quando cerco di eseguire l'app, mi dà un errore nel gonfiaggio del layout, non so perché. Né ho bisogno di creare TextViews nel layout, voglio solo mostrare il Gruppo Radio – Mun0n