वरीयतास्क्रीन में बटन कैसे जोड़ें


106

क्या वरीयता स्क्रीन के नीचे एक बटन जोड़ने और स्क्रॉल करते समय उन्हें सही करने का कोई तरीका है?


2
क्या आपने एक कस्टम प्राथमिकता बनाने पर ध्यान दिया है?
प्रशस्ति

2
भविष्य के आगंतुकों के लिए, जबकि मैक्स का समाधान काम करता है, एक वैकल्पिक समाधान है: stackoverflow.com/a/7251575/802469
रीड

जवाबों:


249

वरीयताओं की उपस्थिति को अनुकूलित करने के लिए एक और समाधान है।

बटन या जो भी आप मानक वरीयताओं में जोड़ना चाहते हैं, उसके साथ एक सामान्य XML लेआउट डिज़ाइन करें। ListViewअपने लेआउट में शामिल करें और इसे आईडी दें @android:id/list

मान लें कि हम लेआउट फ़ाइल कहते हैं res/layout/main.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="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>

अपने में PreferenceActivity, इन दो पंक्तियों को अपने में जोड़ें onCreate:

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

ListViewअपने लेआउट में तो प्राथमिकताओं में हमेशा की तरह परिभाषित द्वारा प्रतिस्थापित किया जाएगा res/xml/preferences.xml


10
काम नहीं करता है जब बटन को सूची दृश्य के नीचे रखा गया है। जब प्राथमिकता गतिविधि संवाद थीम का उपयोग कर रही है तो काम नहीं करती है।
ग्रेग एनिस

11
Developer.android.com/reference/android/preference/… पर वरीयता के उपयोग पर नवीनतम प्रलेखन में उल्लेख है कि सभी नए विकास के लिए प्राथमिकता के कार्यान्वयन के लिए पसंदीदा तरीका है। ऐसा लगता है कि दिए गए समाधान ऐसे परिदृश्य में काम नहीं करेंगे।
पंकज

4
यह अभी भी सूची के साथ स्क्रॉल नहीं करता है।
सुदर्शन भात

7
मैं थोड़ा सा चकित हूँ कि यह उत्तर कितने वोटों का है क्योंकि यह वास्तव में मूल प्रश्न का उत्तर नहीं देता है। यह सूची के साथ स्क्रॉल नहीं करता है, और यह तब काम नहीं करता है जब बटन को दृश्य के निचले भाग में रखा जाता है, जैसा कि ऊपर टिप्पणियों में उल्लेख किया गया है।
हॉवेटल

1
@howett सिर्फ fill_parent को wra_content में ListView Layout_height में बदलें
मार्टिन Ch

56

मुझे पता है कि यह थोड़ा देर हो चुका है, लेकिन मुझे सिर्फ एक समाधान मिला जो मुझे मैक्स के प्रशंसित समाधान से बेहतर लगता है।

आप पसंद करने के लिए बस एक पाद लेख जोड़ सकते हैं (या यदि आप बटन को शीर्ष पर होना चाहते हैं, तो पसंद करें)

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));
    }
}

मुझे उम्मीद है इससे किसी को सहायता मिलेगी।


2
कम से कम यह मैक्स के समाधान के रूप में बेहतर लगता है क्योंकि यह तत्व आईडी पर निर्भर नहीं करता है। आइए देखें कि यह एंड्रॉइड के भविष्य के संस्करणों में कैसे व्यवहार करता है ...
डैनियल एफ

@DanielF। जब तक आप इसे पाने के लिए पुल को पार न करें;)
jpihl

1
मैं ListViewपसंद के साथ प्राप्त नहीं कर सकता हूं
::

1
नहीं, यह उस तरह से काम नहीं करेगा (क्योंकि PreferenceFragmentइसकी अपनी सूची है), लेकिन मैंने इसे सिर्फ एक बनाने Preferenceऔर उस Intentपर सेटिंग करके हल किया। एक बटन बनाने की कोई आवश्यकता नहीं थी (कम से कम मेरे मामले में)
मिशैल के

1
प्राथमिकता के साथ काम नहीं करता है, क्योंकि EnglishFragmentCompat, क्योंकि GetListView वास्तव में एक RecyclerView नहीं
लौटेगा

11

नीचे दिया गया यह उदाहरण पृष्ठ के निचले भाग में एक बटन प्रस्तुत करेगा (यदि कोई व्यक्ति अभी भी रुचि रखता है)।

एक LinearLayout के मामले में आप वजन भी लागू कर सकते हैं; यह आवश्यक है क्योंकि Listview को * fill_parent * पर सेट किया गया है। मैं आमतौर पर इसे * एंड्रॉइड: लेआउट_वेट * के जोड़कर करता हूं:

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

नीचे दिए गए स्पष्टीकरण में 100% का अनुमान नहीं है लेकिन यह आपको समझने में मदद करेगा ...

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

आप यह भी कह सकते हैं, क्योंकि बटन का कोई वजन नहीं है; बटन 0dp ऊंचाई पर प्रदान किया गया है।

अब इस लेआउट_ के साथ जोड़ा गया कि यह बटन को इनवॉइस रेंडर करेगा

+-- 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 के पद से चूक गए
रोनी

7

असल में, एक उपाय है। यहाँ एक कोड है, मुझे आशा है, यह किसी के लिए भी उपयोगी होगा। यह स्क्रीन के तल में 3 विकल्प और 2 बटन जैसा दिखता है, स्क्रीन रिज़ॉल्यूशन से स्वतंत्र (इसे 240 के रूप में सबसे कम लक्षित किया गया था)

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

आपको बस सामान्य गतिविधि के अंदर वरीयता का उपयोग करने और गतिविधि लेआउट में बटन जोड़ने की आवश्यकता है।

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

यहां छवि विवरण दर्ज करें


मैंने इस सुझाव का पालन किया, और यह दृश्य के नीचे स्थित बटन को प्रदर्शित करता है, लेकिन यह वरीयताओं की सूची में सबसे ऊपर है और इसे क्लिक नहीं किया जा सकता है (अर्थात बटन पर क्लिक करने से केवल प्राथमिकता वाली वस्तु सक्रिय हो जाती है)।
इनाडेल्ली

इस समाधान का उपयोग करके
onClickListener पर

@rdehuyss इसे क्योंकि आपको onClickListener को जोड़ना होगा buttonSave:)
Albert

1

यह वही होगा जो कोड को रौनी के उदाहरण में गतिविधि में दिखता है। मेरा इरादा स्क्रीन के निचले भाग में एक मेनू रखना था।

/** 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 का संदर्भ लेता हूं, RelativeLayout का उपयोग करता हूं और सूची के लेआउट_ ऊंचाई के लिए एक ऊंचाई सेट करता हूं, और फिर बटन के लेआउट_alignParentBottom = "true" को सेट करता हूं, यह वरीयतास्क्रीन के नीचे एक बटन को प्रस्तुत कर सकता है; तो @Max के तरीके का उपयोग करें। यह मेरी जरूरतों के लिए काम करता है।


यह एक अच्छा समाधान है, लेकिन आप बटन के ऊपर listview सेट करना भूल गए। वर्तमान में, सूची के आइटम बटन के पीछे हो सकते हैं, जो कि अनुशंसित नहीं है यदि यह अंतिम आइटम है, तो यह कभी भी दिखाई नहीं देगा और इसलिए यह संभव नहीं है।
एंड्रॉयड डेवलपर

ओह, हाँ, आप सही हैं, मैं इस मामले को भूल गया, क्योंकि मेरी सूची में केवल 5 आइटम हैं, धन्यवाद।
मेजोन्जन

कृपया अपने उत्तर को अपडेट करें, ताकि दूसरों के पास यह व्यवहार न हो।
Android डेवलपर

मुझे लगता है कि आप भी कुछ विशेषताओं को भूल गए और सापेक्ष-लेआउट के अंत-टैग।
Android डेवलपर

वास्तव में, सही listview_height सेट करने से आपके द्वारा कही गई समस्या का समाधान हो सकता है।
मेजोन्जन

1

Android मानक दृष्टिकोण के लिए एक्शन बार में एक्शन बटन जोड़ना भी संभव है।

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

वरीयता गतिविधि में कस्टम दृश्य यह Android में वरीयताएँ में कस्टम दृश्य जोड़ने में मदद करेगा।

Main.xml बनाएं, एकमात्र आवश्यक दृश्य एक सूची दृश्य है, जिसमें आईडी है 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 बनाएँ

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

निम्नलिखित आपकी पसंद स्क्रीन पर क्लिक करने योग्य बटन जोड़ने के लिए एक सरल उपाय है। यह आसान बना दिया गया है क्योंकि प्राथमिकताएं पहले से ही Android में स्थान आरक्षित करती हैं: widgetLayout और बटन Android के साथ क्लिक पर पास कर सकते हैं: onClick।

पहले सामग्री के साथ एक बटन। 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="match_parent">
<Button
    android:text="BUTTON"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/button"
    android:onClick="onButtonClick"/>
</LinearLayout>

अब अपनी वरीयताओं में। xml, वरीयता जोड़ें

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

आपकी पसंद को अब केवल ऑनबूटनक्लिक सदस्य रखना है

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

preferences.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

मुझे उपरोक्त सभी उत्तर संयुक्त राष्ट्र के अनुपयोगी लगे, क्योंकि मैंने PreferenceScreenकस्टम लेआउट के अंदर कंटेनर को 'रैप' करने के लिए बनाया था (तब नीचे एक बटन जोड़ना ListView) वास्तव में काम नहीं करता था।

वे केवल वरीयताओं की सूची (फ्लोटिंग) के शीर्ष पर कस्टम लेआउट को हटाते हैं, और एक नया कस्टम बटन क्लिक करने पर (केवल) बटन के नीचे वरीयता को लागू करेगा।

हालांकि, मुझे यह समाधान मिला जो उपयोग करते समय वरीयता सूची कंटेनर के नीचे एक बटन जोड़ने के लिए एक उपचार का काम करता है PreferenceFragment

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.