2012-03-28 19 views
6

Erişilebilir bir uygulama geliştiriyorum. Bu amaçla, arayüzdeki tüm elemanların odağı doğru bir şekilde elde edebilmesi önemlidir, böylece Talckback tarafından okunabilirler. Bu, söz konusu Preference List only shows first elementOdağı beklendiği gibi çalışmıyor ListView

Bu dokunmatik modunda mükemmel çalışır gibi İçim bir ListView ile PreferenceActivity inşa ama aktive Talckback ile ListView erişmeye çalıştığınızda (I ListView Odaklı almak için deneyin Sanki) Beklediğim gibi çalışmıyor. Listedeki çocukların odaklanmasını istiyorum, tüm liste odaklanmıyor. Benim PreferenceActivity içindeki


Ben ek bir sorun var

enter image description hereenter image description here

, iki ListViews kaydırma vardır ve kaydırma doğru çalışmıyor. ListView'u kaydırılabilir yapamaz mıyım?

Teşekkür

Kodu:

ListPreferences.java (Özel 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); 
    } 

} 
+0

liste görünümü biçiminde bir liste görünümü çalışmaz. İç liste görünümünü LinearLayout ile değiştirin. – WarrenFaith

+0

'setFocusableInTouchMode (true)' kullanmayı deneyin? –

+0

Bir LinearLayaout ile deneyin ve aynı sonucu elde ederim ama daha kötü bir arayüzle, eğer LinearLayout ile odağın doğru bir işlevselliğini elde edebilirsem, onu değiştireceğim, ama şimdilik, öyle değil. – Mun0n

cevap

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/düzen/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/values ​​/ 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

Ya da bu hatlar boyunca bir şeyler çalışacak –

+0

Sen tanrısın ..... Bunu yapmaya çalışacağım ... teşekkürler! – Mun0n

+0

Ouch. Bana bazı hatalar veriyor. RadioButton.setOnClickListener'da (bu) biri; Eminim uygulayıcıları doğru yapıyorum. ?? . Ama ana hata, uygulamayı çalıştırmayı denediğimde, mizanpajın şişirilmesinde bana bir hata veriyor, nedenini bilmiyorum. Düzeni içinde TextViews oluşturmaya da gerek yok, sadece RadioGroup – Mun0n

İlgili konular