จะเพิ่มปุ่มใน PreferenceScreen ได้อย่างไร?


137

ฉันค่อนข้างใหม่สำหรับการพัฒนา Android และเพิ่งเจอ Preferences ฉันพบPreferenceScreenและต้องการสร้างฟังก์ชันการเข้าสู่ระบบด้วย ปัญหาเดียวที่ฉันมีคือฉันไม่รู้ว่าจะเพิ่มปุ่ม "เข้าสู่ระบบ" ลงในไฟล์PreferenceScreen.

นี่คือPreferenceScreenลักษณะของฉัน:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
...
    <PreferenceScreen android:title="@string/login" android:key="Login">
        <EditTextPreference android:persistent="true" android:title="@string/username" android:key="Username"></EditTextPreference>
        <EditTextPreference android:title="@string/password" android:persistent="true" android:password="true" android:key="Password"></EditTextPreference>
    </PreferenceScreen>
...
</PreferenceScreen>

ปุ่มควรอยู่ใต้สองEditTextPreferenceวินาที

มีวิธีง่ายๆสำหรับปัญหานี้หรือไม่? วิธีแก้ปัญหาเดียวที่ฉันพบไม่ทำงานเพราะฉันใช้ sub PreferenceScreens

อัปเดต:

ฉันคิดว่าฉันสามารถเพิ่มปุ่มได้ด้วยวิธีนี้:

<PreferenceScreen android:title="@string/login" android:key="Login">
        <EditTextPreference android:persistent="true" android:title="@string/username" android:key="Username"></EditTextPreference>
        <EditTextPreference android:title="@string/password" android:persistent="true" android:password="true" android:key="Password"></EditTextPreference>
        <Preference android:layout="@layout/loginButtons" android:key="loginButtons"></Preference>
</PreferenceScreen>

และไฟล์เลย์เอาต์ ( loginButtons.xml) มีลักษณะดังนี้:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    android:weightSum="10" 
    android:baselineAligned="false" android:orientation="horizontal">
    <Button android:text="Login" android:layout_width="fill_parent"
        android:layout_weight="5" android:layout_height="wrap_content"
        android:id="@+id/loginButton" android:layout_gravity="left"></Button>
    <Button android:text="Password?" android:layout_width="fill_parent"
        android:layout_weight="5" android:layout_height="wrap_content"
        android:id="@+id/forgottenPasswordButton"></Button>
</LinearLayout>

ตอนนี้ปุ่มต่างๆปรากฏขึ้น แต่ฉันไม่สามารถเข้าถึงได้ในรหัส ฉันลองแล้วfindViewById()แต่นี่กลับเป็นโมฆะ มีความคิดอย่างไรที่ฉันจะเข้าถึงปุ่มเหล่านี้



2
BTW คำตอบ @neelabh ง่ายที่สุด - คุณสามารถบรรลุพฤติกรรมที่จำเป็นโดย specifing hanlder เหตุการณ์ใน XML-เค้าโครง: เพียงแค่เพิ่มปุ่มแต่ละที่วิธีการที่กำหนดไว้ในกิจกรรมที่เป็นandroid:onClick="method" public void method(View v)
สแตน

คำตอบ:


310

สำหรับ xml:

<Preference
    android:title="Acts like a button"
    android:key="@string/myCoolButton"
    android:summary="This is a cool button"
/>

จากนั้นสำหรับ java ในไฟล์ onCreate()

Preference button = findPreference(getString(R.string.myCoolButton));
button.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
    @Override
    public boolean onPreferenceClick(Preference preference) { 
        //code for what you want it to do 
        return true;
    }
});

สิ่งนี้จะดูเหมือนเป็นการตั้งค่าปกติโดยมีเพียงชื่อเรื่องและบทสรุปดังนั้นจึงดูเหมือนว่าเป็นของ


7
แอป Google ที่โหลดไว้ล่วงหน้าจำนวนมากใช้แนวทางนี้ดังนั้นจึงเป็นความคิดที่ดีที่จะปฏิบัติตามนั้น! ฉันพบว่าปุ่มสีเทามาตรฐานดูไม่ตรงตำแหน่งบนหน้าจอการตั้งค่าและขอบคุณคุณฉันพบวิธีที่ดีในการทำให้มันดูเป็นมาตรฐาน :)
ทอม

5
ตรวจสอบให้แน่ใจandroid:key="key"และfindPreference("key");ใช้คีย์เดียวกัน
กก

4
อันที่จริงสิ่งนี้ไม่แสดงปุ่มเลยซึ่งจะทำให้ผู้ใช้สับสนและไม่ใช่สิ่งที่ OP ถาม คำตอบที่ถูกต้องในการแสดงปุ่มเป็นของ Nicolas
mutable2112

7
ฉันเพิ่งสังเกตว่าฉันโพสต์สิ่งนี้ในปี 2011 เวลา 01:11 น. ฮ่า ๆ .
กก

3
ควรจะทำอย่างนั้น 1 เดือน 11 วันต่อมา: 11/1 / '11 - 1:11 :)
P Kuijpers

44

ฉันคิดว่ามันสายเกินไป นี่คือสิ่งที่ฉันได้ทำสำหรับการตั้งค่าปุ่ม

การกำหนดค่าตามความชอบในไฟล์ preferences.xml ในโฟลเดอร์ xml

....
    <Preference
        android:key="resetBD"
        android:title="@string/ajustes_almacenamiento"
        android:summary="@string/ajustes_almacenamiento_desc"
        android:widgetLayout="@layout/pref_reset_bd_button" 
    ></Preference>
  ...

และ pref_reset_bd_button.xml ในโฟลเดอร์เค้าโครง

 <?xml version="1.0" encoding="utf-8"?>
   <Button
       xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/resetButton" 
        android:text="@string/ajustes_almacenamiento_bt" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="resetearBD">

   </Button>

android:widgetLayoutเป็นการเชื่อมต่อที่สมบูรณ์แบบระหว่างส่วนย่อยและค่ากำหนด (หนึ่งหรือทั้งสองอย่างที่กำหนดใน XML) ขอบคุณมาก. ที่นี่
peter_the_oak

สวัสดี @Nicolas รหัสของคุณใช้งานได้ แต่มีคำถามข้อเดียว ... คุณจะทำอย่างไรให้ปุ่มทำงานในคลาสที่ขยาย PreferenceActivity
SP

4
ช่วยบอกวิธีหาปุ่มนี้ด้วย id "resetButton" ขอบคุณ!
Ben Jima

ฉันพบว่าใช้ android: layout ที่เหนือกว่า android: widgetLayout เมื่อใช้ widgetLayout ปุ่มของฉันกลายเป็นสิ่งที่ฉันสามารถอธิบายได้ว่าเป็น layout_alignParentRight = "true" เท่านั้น แต่พฤติกรรมนั้นหายไปเมื่อใช้ android: layout แทน
JoeHz

1
และฉันไม่สามารถทำให้สิ่งนี้เริ่มต้นตัวจัดการเหตุการณ์ onPreferenceChange หรือ Click ได้
JoeHz

38

ฉันต้องการเพิ่มลิงก์ออกไปยังการตั้งค่าและสามารถแก้ไขโค้ดของ Jakar เพื่อให้ทำงานได้ดังนี้:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >   
   <PreferenceCategory android:title="Settings">
       <Preference android:title="Click to exit" android:key="exitlink"/>       
   </PreferenceCategory>    
</PreferenceScreen>

เดิมที 'Preference' เป็น 'EditTextPreference' ซึ่งฉันแก้ไขด้วยมือ

จากนั้นในชั้นเรียน:

public class MyPreferences extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.mypreferences);

    Preference button = (Preference)getPreferenceManager().findPreference("exitlink");      
    if (button != null) {
        button.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference arg0) {
                finish();   
                return true;
            }
        });     
    }
}
}

3
ใช้งานได้ดี ยอดเยี่ยมมาก!
RRTW

8

เพิ่ม

setContentView(R.layout.buttonLayout);

ด้านล่าง

addPreferencesFromResource(R.xml.yourPreference);

ปุ่มเค้าโครง:

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

<RelativeLayout
        android:id="@+id/top_control_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
</RelativeLayout>

<LinearLayout
        android:id="@+id/bottom_control_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true">

    <Button
            android:id="@+id/button"
            android:layout_width="match_parent"
            android:layout_height="70dp"
            android:text="@string/saveAlarm"/>
</LinearLayout>

<ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_above="@id/bottom_control_bar"
        android:layout_below="@id/top_control_bar"
        android:choiceMode="multipleChoice">
</ListView>

ปุ่มเข้าถึงโดย:

Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        //Your event
    }
});

คุณสามารถรับปุ่มที่ด้านบนหรือด้านล่างของหน้าจอได้โดยวางปุ่มใน RelativeLayout:

  • top_control_bar
  • bottom_control_bar

bottom_control_bar

สิ่งนี้ได้ผลสำหรับฉัน ฉันหวังว่าฉันจะช่วยใครบางคนเกี่ยวกับรหัสนี้ได้


ฉันใช้สิ่งนี้ในแอพของฉันมันทำให้ปุ่มอยู่ด้านบนของรายการซึ่งดูดีกว่าและใช้งานง่ายกว่าสำหรับปุ่มตกลงและยกเลิก ขอบคุณ.
Grux

1

ฉันไม่คิดว่าจะมีวิธีง่ายๆในการเพิ่มปุ่มลงในหน้าจอการตั้งค่า ค่ากำหนด จำกัด ไว้ที่:

EditTextPreference
ListPreference
RingtonePreference
CheckboxPreference

ในขณะที่ใช้หน้าจอการตั้งค่าคุณถูก จำกัด การใช้งานตัวเลือกเหล่านี้และไม่มี "ปุ่ม - ค่ากำหนด" เพียงปุ่มเดียวที่สามารถใช้ได้อย่างง่ายดายตามความต้องการของคุณ

ฉันกำลังมองหาฟังก์ชันการทำงานที่คล้ายกันโดยการเพิ่มปุ่มในหน้าจอการตั้งค่า แต่ดูเหมือนว่าคุณจะต้องสร้างหน้าจอของคุณเองเพื่อจัดการการเปลี่ยนแปลงค่ากำหนดในการใช้งานของคุณเอง


มีปัญหาเดียวกันถ้าคุณต้องการปุ่มในการตั้งค่าของคุณคุณต้องใช้หน้าจอ pref ที่สร้างขึ้นเอง :(
Janusz

1

คุณสามารถทำเช่นนี้เพื่อเข้าถึงปุ่ม!

 View footerView = ((LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.layoutButtons, null, false);

อย่าลืมเพิ่มandroid:idLinearLayout ที่มีปุ่มในlayoutButtons.xmlเช่น android:id="@+id/mylayout"

 LinearLayout mLayout = (LinearLayout) footerView.findViewById(R.id.mylayout);
 Button login = (Button) footerView.findViewById(R.id.loginButton);
 login.setOnClickListener(this);
 ListView lv = (ListView) findViewById(android.R.id.list);
 lv.addFooterView(footerView);

 // Lines 2 and 3 can be used in the same way for a second Button!

อย่าลืมทำเครื่องหมายคำถามนี้เป็น TRUE ถ้าคุณรู้สึกว่าฉันช่วยคุณได้หรือไม่?
Shah

1

หากคุณต้องการให้ผู้ใช้คลิกที่รายการการตั้งค่ารายการใดรายการหนึ่งและแอปของคุณกำลังใช้อยู่PreferenceFragmentCompatคุณสามารถทำได้:

<PreferenceScreen
...
>
...
<Preference
    android:key="@string/pref_key_clickable_item"
    android:persistent="false"
    android:title="Can be clicked"
    android:summary="Click this item so stuff will happen"/>
...
</PreferenceScreen>

Java:

@Override
onPreferenceTreeClick(Preference preference) {
    if (preference.getKey().equals(getContext().getString(R.string.pref_key_clickable_item))) {
       // user clicked the item
       // return "true" to indicate you handled the click
       return true;
    }
    return false;
}

Kotlin:

override fun onPreferenceTreeClick(preference: Preference): Boolean {
    if (preference.key == context?.getString(R.string.pref_key_clickable_ite)) {
       // user clicked the item
       // return "true" to indicate you handled the click
       return true
    }
    return false
}

0

Preference.onCreateView(parent)นอกจากนี้คุณยังสามารถปรับแต่งรูปแบบของการตั้งค่าโดยการเอาชนะ ตัวอย่างด้านล่างใช้คลาสภายในที่ไม่ระบุชื่อเพื่อสร้างค่ากำหนดสีแดง

    screen.addPreference(
        new Preference(context) {
            @Override
            protected View onCreateView(ViewGroup parent) {
                View view = super.onCreateView(parent);
                view.setBackgroundColor(Color.RED);
                return view;
            }
        });

คุณสามารถใช้เทคนิคนี้เพื่อเพิ่มปุ่มในมุมมองเริ่มต้น


0

สร้างเค้าโครงที่กำหนดเองสำหรับSettingsFragment.javaIElayout_settings.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.settings.SettingsFragment"
    tools:ignore="NewApi">

    <com.google.android.material.appbar.AppBarLayout
        android:id="@+id/appBarSettings"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppBarOverlay">

        <com.google.android.material.appbar.MaterialToolbar
            android:id="@+id/toolbarSettings"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:minHeight="?attr/actionBarSize"
            app:title="@string/fragment_title_settings" />
    </com.google.android.material.appbar.AppBarLayout>

    <!--this works as the container for the SettingsFragment.java
    put the code for the Button above or below this FrameLayout
    according to your requirement-->

    <FrameLayout
        android:id="@android:id/list_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
      app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior" />


    <com.google.android.material.button.MaterialButton
        android:id="@+id/btnSample"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|center"
        android:text="@string/button_sample_text" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

จากนั้นอ้างถึงไฟล์เลย์เอาต์ในstyles.xml:

<style name="AppTheme" parent="....">
      ...............
      ...............
      <item name="preferenceTheme">@style/MyPreferenceThemeOverlay</item>
</style>

<style name="MyPreferenceThemeOverlay" parent="PreferenceThemeOverlay">
      <item name="android:layout>@layout/layout_settings</item>
</style>

จากนั้นในonViewCreated()วิธีการของคุณSettingsFragment.javaคุณสามารถใช้ปุ่มดังนี้:

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle 
                             savedInstanceState) {

        MaterialButton btnSample = view.findViewById(R.id.btnSample);
        btnSample.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(requireContext(), "Sample Button 
                   clicked!!", Toast.LENGTH_LONG).show();
            }
        });
    }

ตัวอย่างหน้าจอการตั้งค่าพร้อมปุ่ม


-1

ลองใช้ android: onClick = "myMethod" ใช้งานได้ดีสำหรับเหตุการณ์ onclick ง่ายๆ


4
Preferenceไม่มีonClickทรัพย์สิน
ercan

คำตอบมีความหมายandroid:onClickในมุมมองปุ่มที่แนบมาไม่ใช่ในการตั้งค่าเอง
สแตน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.