PreferenceScreen'e düğme ekleme


106

Tercihler ekranının altına bir düğme eklemenin ve kaydırma sırasında doğru çalışmasını sağlamanın bir yolu var mı?


2
Özel bir tercih oluşturmaya baktınız mı?
Prashast

2
Gelecekteki ziyaretçiler için, Max'in çözümü işe
Reed

Yanıtlar:


249

Tercihlerin görünümünü özelleştirmek için başka bir çözüm var.

Düğmelerle veya standart tercihlere ne eklemek isterseniz normal bir XML düzeni tasarlayın. ListViewDüzeninize bir ekleyin ve ona kimliği verin @android:id/list.

Diyelim ki layout dosyası diyoruz res/layout/main.xml. Şunun gibi görünebilir:

<?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="match_parent"
              android:orientation="vertical">
    <Button android:text="This is a button on top of all preferences."
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    <ListView android:id="@android:id/list"
              android:layout_width="match_parent"
              android:layout_height="wrap_content" />
</LinearLayout>

Senin içinde PreferenceActivity, şu iki satırı ekle onCreate:

addPreferencesFromResource(R.xml.preferences);
setContentView(R.layout.main);

ListViewMizanpajınızda sonra olağan bir şekilde tanımlanmış tercihleri ile değiştirilecektir res/xml/preferences.xml.


10
Liste görünümünün altına düğme yerleştirildiğinde çalışmaz. Tercihler etkinliği iletişim temasını kullandığında çalışmaz.
Greg Ennis

11
Developer.android.com/reference/android/preference/… adresindeki PreferenceActivity kullanımıyla ilgili en son belgeler, tüm yeni geliştirmeler için PreferenceFragment'ın tercih edilen uygulama yolu olduğunu belirtmektedir. Görünüşe göre verilen çözüm böyle bir senaryoda işe yaramayacak.
Pankaj

4
Hala listeyle kaymıyor.
Sudarshan Bhat

7
Aslında orijinal soruyu cevaplamadığından, bu cevabın kaç oy aldığını görmek beni biraz şaşırttı. Listeyle birlikte kaymaz ve yukarıdaki yorumlarda belirtildiği gibi düğme görünümün altına yerleştirildiğinde çalışmaz.
howettl

1
@howettl ListView layout_height içinde fill_parent öğesini wrap_content olarak değiştirin
Martin Ch

56

Bunun biraz geç olduğunu biliyorum, ancak Max'in övülen çözümünden daha çok sevdiğim bir çözüm buldum.

PreferenceActivity ListView'e basitçe bir altbilgi (veya düğmenin en üstte olmasını istiyorsanız, bir başlık) ekleyebilirsiniz:

public class MyActivity extends PreferenceActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
        ListView v = getListView();
        v.addFooterView(new Button(this));
    }
}

Umarım bu birine yardımcı olur.


2
En azından bu, öğe kimliklerine dayanmadığı için Max'in çözümü olarak daha iyi hissettiriyor. Android'in gelecekteki sürümlerinde nasıl davrandığını görelim ...
Daniel F

@DanielF. varana kadar köprüyü
geçmeyin

1
ListViewPreferenceFragment ile elde edemiyorum :(
Michał K

1
Hayır, (çünkü bu şekilde işe yaramaz PreferenceFragmentkendi listesi vardır), ama sadece bir oluşturarak bu çözüme Preferenceve bir ayar Intentüzerinde. Düğme oluşturmaya gerek yoktu (en azından benim durumumda)
Michał K

1
PreferenceFragmentCompat ile çalışmıyor, çünkü getListView aslında bir RecyclerView
Mauker

11

Aşağıdaki bu örnek, sayfanın alt kısmında bir düğme oluşturacaktır (hala ilgilenen biri varsa).

Bir Doğrusal Yerleşim durumunda, ağırlıkları da uygulayabilirsiniz; bu gereklidir çünkü Liste görünümü * fill_parent * olarak ayarlanmıştır. Bunu genellikle * android: layout_weight * 'leri ekleyerek yaparım:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:orientation="vertical">
    <ListView android:id="@android:id/list"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent" android:layout_weight="10"/>
    <Button android:text="This is a button on top of all preferences."
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" android:layout_weight="1"/>
</LinearLayout>

Aşağıdaki açıklama muhtemelen% 100 değildir, ancak anlamanıza yardımcı olacaktır ...

+-- View Port (linear layout)
| +-- List View (this is where the preferences will go)
| |
| |
| +--
+--
  +--
  | Button (which was pushed out of view by the fillparent of ListView
  +--

Ayrıca, Düğmenin ağırlığı olmadığı için de diyebilirsiniz; düğme 0dp yüksekliğinde oluşturulur.

Şimdi layout_weigths eklendiğinde, düğmenin görüntülemeyi oluşturmasına izin verecek

+-- View Port (linear layout)
| +-- List View (this is where the preferences will go)
| |
| |
| +--
| +--
| | Button (which was pushed out of view by the fillparent of ListView
| +--
+--

@Stealthcopter
Ronnie

7

Aslında bir çözüm var. İşte bir kod, umarım bu herkes için yararlı olur. Ekran çözünürlüğünden bağımsız olarak ekranın altında 3 seçenek ve 2 düğme gibi görünüyor (en düşük olarak 240 olarak hedeflendi)

package com.myapplication.gui;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceScreen;
import android.view.Display;
import android.view.Gravity;
import android.view.WindowManager;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ScrollView;
import com.myproject.general.HeightListView;

import com.myapplication.R;

public class FilterActivity extends PreferenceActivity {

    private LinearLayout rootView; 
    private LinearLayout buttonView; 
    private Button buttonDone;
    private Button buttonRevert;
    private ListView preferenceView; 
    private LinearLayout gradientView;
    private ScrollView scrollRoot;

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 

        Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
        int height = display.getHeight();
        int width = height > 240 ? display.getWidth() : display.getWidth() - 4;

        scrollRoot = new ScrollView(this);
        scrollRoot.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));

        rootView = new LinearLayout(this); 
        rootView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
        rootView.setOrientation(LinearLayout.VERTICAL);

        buttonView = new LinearLayout(this); 
        buttonView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
        buttonView.setOrientation(LinearLayout.HORIZONTAL);
        buttonView.setGravity(Gravity.BOTTOM);

        gradientView = new LinearLayout(this);
        gradientView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
        gradientView.setOrientation(LinearLayout.HORIZONTAL);
        gradientView.setBackgroundResource(R.drawable.gradient);
        gradientView.setPadding(0, 5, 0, 0);
        gradientView.setBackgroundResource(R.drawable.gradient);

        buttonDone = new Button(this); 
        buttonDone.setText(R.string.filterButton_Done); 
        buttonDone.setLayoutParams(new LayoutParams(width/2, LayoutParams.WRAP_CONTENT));
        gradientView.addView(buttonDone);

        buttonRevert = new Button(this); 
        buttonRevert.setText(R.string.filterButton_Revert);
        buttonRevert.setLayoutParams(new LayoutParams(width/2, LayoutParams.WRAP_CONTENT));
        gradientView.addView(buttonRevert);

        buttonView.addView(gradientView);

        preferenceView = new HeightListView(this); 
        preferenceView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); 
        preferenceView.setId(android.R.id.list); 

        PreferenceScreen screen = createPreferenceHierarchy(); 
        screen.bind(preferenceView); 
        preferenceView.setAdapter(screen.getRootAdapter()); 
        rootView.addView(preferenceView);
        rootView.addView(buttonView);

        if (height > 240) {
            this.setContentView(rootView);
        }
        else {
            scrollRoot.addView(rootView);
            this.setContentView(scrollRoot);
        }

        setPreferenceScreen(screen); 
    } 

    private PreferenceScreen createPreferenceHierarchy() {        
        PreferenceScreen root = getPreferenceManager().createPreferenceScreen(this);

        PreferenceScreen pref1 = getPreferenceManager().createPreferenceScreen(this);
        pref1.setKey("pref1");
        pref1.setTitle("Title");
        pref1.setSummary("Summary");
        root.addPreference(pref1); 

        PreferenceScreen pref2 = getPreferenceManager().createPreferenceScreen(this);
        pref2.setKey("pref2");
        pref2.setTitle("Title");
        pref2.setSummary("Summary");
        root.addPreference(pref2); 

        PreferenceScreen pref3 = getPreferenceManager().createPreferenceScreen(this);
        pref3.setKey("pref3");
        pref3.setTitle("Title");
        pref3.setSummary("Summary");
        root.addPreference(pref3); 

        return root; 
    } 
}

2

Genel Aktivite içinde PreferenceFragment kullanmanız ve düğmeyi aktivite düzenine eklemeniz yeterlidir.

public class SettingActivity extends Activity {

    UserProfileViewModel userProfileViewModel = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_setting);
        getFragmentManager().beginTransaction()
                .replace(R.id.content, new SettingsFragment())
                .commit();

    }

    private class SettingsFragment extends PreferenceFragment {
        public SettingsFragment() {
        }

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            // Load the preferences from an XML resource
            addPreferencesFromResource(R.xml.pref_main);

        }
    }
}

SettingActivity.java

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

    <FrameLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/buttonSave"/>

    <Button
        android:id="@+id/buttonSave"
        android:text="Save"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />
</RelativeLayout>

Activity_setting

görüntü açıklamasını buraya girin


Bu öneriyi izledim ve düğmeyi görünümün altında görüntülüyor, ancak tercihler listesinin üstüne yerleştirilmiş ve tıklanamıyor (yani düğmeye tıklamak yalnızca alttaki tercih öğesini etkinleştirir).
iaindownie

OnClickListener düğmesi bu çözüm kullanılarak çalıştırılmaz
rdehuyss

@rdehuyss it çünkü onClickListener'ı eklemeniz gerekiyor buttonSave:)
Albert

1

Bu, Ronny'nin örneğindeki etkinlikte kodun göründüğü gibi olacaktır. Niyetim ekranın alt kısmına bir menü koymaktı.

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.prefs);
    addPreferencesFromResource(R.xml.prefs);

   /* LayoutInflater CX = getLayoutInflater();
    CX.inflate(R.layout.main,null);*/
    // TODO Auto-generated method stub
}

1
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="@dimens/listview_height" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:text="This is a button on top of all preferences." />
</RelativeLayout>

@Ronnie'ye referansta bulunuyorum, RelativeLayout kullanıyorum ve listview için layout_height için bir yükseklik ayarlıyorum ve sonra düğmenin layout_alignParentBottom = "true" ayarını yapıyorum, PreferenceScreen'in alt kısmında bir buton oluşturabilir; sonra @Max yolunu kullanın. ihtiyaçlarım için çalışıyor.


Bu güzel bir çözüm, ancak liste görünümünü düğmenin yukarısına ayarlamayı unuttunuz. şu anda, liste görünümünün öğeleri düğmenin arkasında olabilir; bu, son öğe ise hiçbir zaman görünür olmayacağından ve dolayısıyla tıklanabilir olmayacağından önerilmez.
android geliştiricisi

oh, evet, haklısın, bu vakayı unuttum çünkü listem sadece 5 maddeyi gösteriyor, teşekkürler.
Mejonzhan

lütfen cevabınızı güncelleyin, böylece diğerleri bu davranışa sahip olmaz.
android geliştiricisi

Bence, göreliLayout'un bazı niteliklerini ve bitiş etiketini de unuttun.
android geliştiricisi

Aslında, doğru listview_height değerini ayarlamak, söylediğiniz sorunu çözebilir.
Mejonzhan

1

Android standart yaklaşımı için eylem çubuğuna Eylem düğmeleri eklemek de mümkündür.

public class PrefActivity extends PreferenceActivity{

  @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
      // Inflate the menu items for use in the action bar
      MenuInflater inflater = getMenuInflater();
      inflater.inflate(R.menu.preference_header_menu, menu);
      return super.onCreateOptionsMenu(menu);
  }

}


    <?xml version="1.0" encoding="utf-8"?>
       <menu xmlns:android="http://schemas.android.com/apk/res/android">
       <item android:id="@+id/action_add"
           android:icon="@drawable/ic_menu_add_dark"
           android:title="@string/menu_action_add_title"
           android:showAsAction="always"  />

   </menu>

0

Tercih Etkinliğinde özel görünüm bu, Android'de PreferenceActivity'de özel görünüm eklemenize yardımcı olacaktır.

Sadece gerekli görünüm kimliğe sahip bir ListView olduğunu, main.xml oluşturun: android:id="@android:id/list".

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="fill_parent"
        android:layout_height="fill_parent" android:weightSum="1">
        <ListView 
            android:id="@android:id/list" 
            android:layout_weight="1"
            android:layout_width="fill_parent"
                android:layout_height="0dp">
        </ListView>
        <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

CustomPreferenceActivity.java oluştur

public class CustomPreferenceActivity extends PreferenceActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                addPreferencesFromResource(R.xml.settings);

                //setup any other views that you have
                TextView textView = (TextView) findViewById(R.id.textView);
textView.setText("View Added");
        }
}

0

Aşağıdaki, tercih ekranınıza tıklanabilir bir düğme eklemenin basit bir çözümüdür. Bu, tercihler zaten android: widgetLayout'ta yer ayırdığı ve düğme android: onClick ile tıklamaları geçebildiği için kolaylaştırılmıştır.

Önce içerikle bir button.xml oluşturun

<?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="match_parent">
<Button
    android:text="BUTTON"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/button"
    android:onClick="onButtonClick"/>
</LinearLayout>

Şimdi tercihler.xml dosyanıza tercihi ekleyin

<Preference
    android:key="button"
    android:title="Title"
    android:summary="Summary"
    android:widgetLayout="@layout/button" />

PreferenceActivity artık yalnızca bir onButtonClick üyesi içermelidir

public class MainActivity extends PreferenceActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    addPreferencesFromResource(R.xml.main_preferences);


}

public void onButtonClick(View v) {
    Log.d("Button", "Yeah, button was clicked");
}
}

0

tercihler.xml:

    <Preference
        android:key="clearAllData"
        android:title="@string/settings_clear_all_data">
    </Preference>

SettingsFragment.java:

public class SettingsFragment extends PreferenceFragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.settings);

        Preference clearAllData = (Preference) findPreference("clearAllData");

        // setup buttons
        final Context context = getActivity();
        clearAllData.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {

            @Override
            public boolean onPreferenceClick(Preference preference) {
                ...
            }
    }

}

0

PreferenceScreenKabı özel düzenlerin içine 'sarmak' için oluşturduğum herhangi bir düzen (daha sonra altına bir düğme ekleyerek ListView) gerçekten işe yaramadığı için yukarıdaki yanıtların tümünü kullanılamaz buldum .

Yalnızca tercihler listesinin (kayan) üst kısmına özel düzeni kapladılar ve yeni bir özel düğmeyi tıklamak (örneğin) yalnızca düğmenin altındaki tercihi çağırır.

Bununla birlikte, kullanırken, tercihler listesi kabının altına bir düğme eklemek için bir muamele yapan bu çözümü buldum PreferenceFragment.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.