2013-06-25 24 views
7

Listenin (ListView) üzerinde bazı üstbilgi metinleri (TextView) ekleyebilmem için özel bir Listeyi Görüntüle iletişim kutusu oluşturmam gerekiyor.() OnCreateDialogView ListPreference uzanır ve geçersiz kılar oluşturduğum MyListPreference sınıfı:ListView neden ListPreference iletişim kutusundaki TextView üzerinde kalıyor?

@Override 
protected View onCreateDialogView() { 
    LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View v = (View) inflater.inflate(R.layout.dialog_preference_list, null); 
    return v; 
} 

My XML düzen dialog_preference_list.xml içerir:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="TextView" /> 

    <ListView 
     android:id="@android:id/list" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:drawSelectorOnTop="false" 
     android:scrollbarAlwaysDrawVerticalTrack="true" /> 

</LinearLayout> 

Sorun: TextView'un ListView yerine altında görüntülenir yukarıdaki. Yukarıda olması için TextView'a ihtiyacım var. Ben LinearLayout ve RelativeLayout ("aşağıdaki" veya "yukarıdaki" özniteliklerini kullanarak) hiçbir başarı ile denedim: TextView ListView yukarıda koymak için bir yol bulamıyorum ... Düzeni oldukça basit ve göremiyorum Listenin yukarısında neden kalıyor ... Ayrıca, sorunun hem gerçek bir aygıtta (Nexus 4, Android 4.2.2) hem de emülatörde oluştuğunu unutmayın. Bununla birlikte, Eclipse'in grafiksel düzeninde oluşturulan düzeni incelediğinizde, düzen doğrudur! Ekli fotoğraflara bakın.

Bunu nasıl çözeceğiniz konusunda bir fikrin var mı? Çözelti 10.07.2013 ile

Layout rendered on Eclipse (correct)

Düzenleme: Eclipse (doğru) işlenen

Layout rendered on the device (incorrect)

Düzeni: (yanlış) cihazda oluşturulma

Düzen

Kabul edilen yanıtın önerdiği gibi, sorun, buPersonel'ın onPrepareDialogBuilder() öğesinde builder.setSingleChoiceItems() kullanımından kaynaklanır. ListPreference'ı genişletip onCreateDialogView() öğesini, oluşturucu olmadan Dialog'u oluşturmak için düzeltdim, böylece liste öğelerinin üst kısmındaki üstbilgi metnini gösteren özel bir Görünüm oluşturabilirim.

GPListPreference.java:

public class GPListPreference extends ListPreference { 
    ... 

    @Override 
    protected void onPrepareDialogBuilder(AlertDialog.Builder builder) { 
     builder.setNegativeButton(null, null); 
     builder.setPositiveButton(null, null); 
    } 

    private int getValueIndex() { 
     return findIndexOfValue(getValue()); 
    } 

    @Override 
    protected View onCreateDialogView() { 
     LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     ListView lv = (ListView) inflater.inflate(R.layout.dialog_preference_list, null); 

     TextView header = (TextView) inflater.inflate(R.layout.dialog_preference_list_header, null); 
     header.setText(getDialogMessage()); // you should set the header text as android:dialogMessage in the preference XML 
     lv.addHeaderView(header); 

     ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(getContext(), R.layout.dialog_preference_list_singlechoice, getEntries()); 
     lv.setAdapter(adapter); 

     lv.setClickable(true); 
     lv.setEnabled(true); 
     lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
     lv.setItemChecked(getValueIndex() + 1, true); 
     lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       setValueIndex(position - 1); 
       getDialog().dismiss(); 
      } 
     }); 

     return lv; 
    } 
} 

dialog_preference_list.xml:

<?xml version="1.0" encoding="utf-8"?> 
<ListView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/list" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:drawSelectorOnTop="false" 
    android:scrollbarAlwaysDrawVerticalTrack="true" /> 

dialog_preference_list_singlechoice.xml

<?xml version="1.0" encoding="utf-8"?> 
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:checkMark="?android:attr/listChoiceIndicatorSingle" 
    android:ellipsize="marquee" 
    android:gravity="center_vertical" 
    android:minHeight="?android:attr/listPreferredItemHeight" 
    android:paddingBottom="2dip" 
    android:paddingLeft="10dip" 
    android:paddingRight="10dip" 
    android:paddingTop="2dip" 
    android:textAppearance="?android:attr/textAppearanceMedium" /> 

dialog_preference_list_header.xml

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:padding="10dip" 
    android:textAppearance="?android:attr/textAppearanceSmall"> 

</TextView> 
+0

Kodu ekledikten Can: dialog_preference_list_header benim durumumda sadece TestView içinde, ama daha karmaşık bir görünüm olabilir ve custom_dialog_single_choice_list_adapter böyle bir şey olabilir

@Override protected void onPrepareDialogBuilder(AlertDialog.Builder builder) { // Not calling super, to avoid having 2 listviews // Set the positive button as null builder.setPositiveButton(null, null); } private int getValueIndex() { return findIndexOfValue(getValue()); } 

liste için? veya "ListView" anlamına gelen herhangi bir kod – Muzikant

+0

Sadece açık olmak gerekirse, denediniz: "android: layout_above =" @ + id/list "' ve isteğe bağlı olarak, android: layout_alignParentTop = "true" ', TextView, orijinal dialog_preference_list.xml, sağdan mı? – JaKXz

+0

Müthiş cevap! Teşekkürler muslidrikk. – Tiago

cevap

4

Sorun, ListPreference'ın çalışma biçiminde olduğunu düşünüyorum. ListPreference, RadioButtons ile satır oluşturmak için Builder.setSingleChoiceItems() kullanır ve eklemeye çalıştığınız özel mizanpaj üzerinde tercihinize sahiptir (sizin durumunuzda bir TextView ve bir LinearLayout içinde bir ListView. Çözüm, onun yerine DialogPreference'ı genişletiyor.) Here .. ne istediğini yapan bir özel DialogPreference oluşturulan bir GitHub'dan bir bağlantı ben RadioButton mantığını kodlu değil

+0

bu yardımcı oldu mu? – Emmanuel

+0

Önerileriniz için teşekkürler. Gerçekten de sorun, Builder.setSingleChoiceItems() 'den geliyor. Iletişim kurucusunu kullanmamak için ListPreference'ı genişleterek ve onCreateDialogView() öğesini geçersiz kılarak düzeltdim. Kodu ayrı bir cevaba koyacağım. – muslidrikk

+0

İyi Yardımcı olabildim. GitHub bağlantısı size hiç yardımcı oldu mu? – Emmanuel

2

Ben bir tema sorunu sanırım. İletişimcinizin temasını değiştirmeyi deneyin. Oluşturucu, setStyle(STYLE_NO_TITLE, R.style.AppTheme) gibi bir şey yapsın. No_title stili ile temel uygulama temanız.

Sorun bu değilse, ListPreference sınıfının kendisi ile ilgili olabilir.Tercih görünümlerini belirlerken, düzeninizi tutarlılık için geçersiz kılabilir. Ancak, daha önce ListPreference kullanmamıştım, bu yüzden sadece bir tahmin.

XML grafik düzeni önizlemesinde temalarla oynayarak aynı sonucu yeniden üretebilir misiniz?

+0

Öneriniz için teşekkür ederiz. Ancak temalarla oynadıktan sonra ortaya çıkmadığı ortaya çıktı. – muslidrikk

1

deneyebileceğiniz Başka bir seçenek böyle ListView bir başlık olarak TextView eklemektir:

TextView textView = new TextView(getActivity()); 
ListView listView = new ListView(getActivity()); 
listView.addHeaderView(textView); 

addHeaderView böylece teorik olarak hiçbir şey bir View alır Üstbilgi olmak istiyorsunuz, ancak sadece TextView kullanıyorum.

+0

Teşekkürler, ama addHeaderView() bir ListPreference'ın ListView ... – muslidrikk

0

Yukarıdaki bağlantı bozuk. Bu çözümde, liste ListPreference'ı geçersiz kılar ve ListPreference'da tanımlanan verilerle kendi liste görünümünüzü şişirir.

@Override 
protected View onCreateDialogView() { 

    LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    ListView lv = new ListView(getContext()); 

    // Inflate the view into the header only if a message was set 
    if (getDialogMessage() != null && ! getDialogMessage().equals("")) { 

     TextView header = (TextView) inflater.inflate(R.layout.dialog_preference_list_header, null); 
     header.setText(getDialogMessage()); 
     lv.addHeaderView(header, null, false); 

    } 

    // Create a new adapter and a list view and feed it with the ListPreference entries 
    ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(getContext(), 
      R.layout.custom_dialog_single_choice_list_adapter, getEntries()); 

    lv.setAdapter(adapter); 
    lv.setClickable(true); 
    lv.setEnabled(true); 
    lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
    lv.setItemChecked(getValueIndex() + 1, true); 
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      setValueIndex(position - 1); 
      getDialog().dismiss(); 
     } 
    }); 
    return lv; 
} 

diğer önemli şey onPrepareDialogBuilder değil o süper çağırarak aramak. Bu, liste görünümünün iki kez görünmesini engelleyecektir. değerleri başlatılamıyor nerede

<?xml version="1.0" encoding="utf-8"?> 
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:checkMark="?android:attr/listChoiceIndicatorSingle" 
    android:ellipsize="marquee" 
    android:gravity="center_vertical" 
    android:minHeight="?android:attr/listPreferredItemHeight" 
    android:paddingBottom="2dip" 
    android:paddingLeft="10dip" 
    android:paddingRight="10dip" 
    android:paddingTop="2dip" 
    android:textAppearance="?android:attr/textAppearanceMedium" /> 
İlgili konular