Làm cách nào để thêm nút vào PreferenceScreen?


135

Tôi còn khá mới với Phát triển Android và mới bắt gặp Tùy chọn. Tôi tìm thấy PreferenceScreenvà muốn tạo một chức năng đăng nhập với nó. Vấn đề duy nhất tôi có là tôi không biết làm thế nào tôi có thể thêm nút "Đăng nhập" vào PreferenceScreen.

Đây là những gì tôi PreferenceScreentrông giống như:

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

Nút phải ở dưới hai EditTextPreferences.

Có một giải pháp đơn giản cho vấn đề này? Một giải pháp tôi thấy không hiệu quả vì tôi sử dụng sub PreferenceScreens.

Cập nhật:

Tôi đã tìm ra rằng tôi có thể thêm các nút theo cách này:

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

và tệp bố cục ( loginButtons.xml) trông như vậy:

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

Vì vậy, bây giờ các nút xuất hiện nhưng tôi không thể truy cập chúng trong mã. Tôi đã thử nó với findViewById()nhưng điều này là trả về null. Bất kỳ ý tưởng làm thế nào tôi có thể truy cập các nút này?


Nhìn vào câu hỏi này stackoverflow.com/questions/2697233/
Mạnh

2
Câu trả lời của BTW, @neelabh là đơn giản nhất - bạn có thể đạt được hành vi cần thiết bằng cách chỉ định hanlder sự kiện trong bố cục xml: chỉ cần thêm android:onClick="method"vào mỗi nút, trong đó phương thức được xác định trong hoạt động như public void method(View v).
Stan

Câu trả lời:


304

Đối với xml:

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

Sau đó, cho java trong của bạn 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;
                }
            });

Điều này sẽ xuất hiện như một Ưu tiên bình thường, chỉ với một tiêu đề và một bản tóm tắt, vì vậy nó sẽ trông giống như nó thuộc về.

Chỉnh sửa: Tôi đã thay đổi thành sử dụng @string/myCoolButtongetString(R.string.myCoolButton)vì tốt nhất nên sử dụng tài nguyên để hỗ trợ trình biên dịch, dịch ngôn ngữ và dễ dàng thay đổi Chuỗi.


7
Nhiều ứng dụng google được tải sẵn sử dụng phương pháp này và do đó, nên làm theo cách đó! Tôi tìm thấy một nút màu xám tiêu chuẩn trông không đúng chỗ trên màn hình tùy chọn và nhờ có bạn, tôi đã tìm thấy một cách hay để làm cho nó trông chuẩn hóa :)
Tom

5
Hãy chắc chắn rằng android:key="key"findPreference("key");đang sử dụng cùng một khóa.
Sậy

4
thực tế điều này hoàn toàn không hiển thị một nút nào, điều này sẽ gây nhầm lẫn cho người dùng và không phải là những gì OP yêu cầu. câu trả lời đúng để thực sự hiển thị một nút là của Nicolas.
mutable2112

7
Tôi chỉ nhận thấy rằng tôi đã đăng bài này vào năm 2011 lúc 1:11. Haha.
Sậy

3
Đáng lẽ phải làm điều đó 1 tháng và 11 ngày sau: 11/1 / '11 - 1:11 :)
P Kuijpers

43

Tôi cho rằng quá muộn. Đây là những gì tôi đã làm cho Tùy chọn Nút.

Tùy chọn trong tệp ưu tiên trong thư mục xml

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

và pref_reset_bd_button.xml trong thư mục bố cục

 <?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:widgetLayoutlà kết nối hoàn hảo giữa các đoạn và sở thích (một hoặc cả hai được xác định trong XML). Cảm ơn rất nhiều. Tại đây
peter_the_oak

Xin chào @Nicolas. Mã của bạn hoạt động, nhưng một câu hỏi ... Làm thế nào bạn có thể làm điều đó để nút hoạt động trong một lớp mở rộng PreferenceActivity
SP

4
Xin vui lòng cho tôi biết làm thế nào để tìm nút này với id "resetButton" cảm ơn!
Ben Jima

Tôi tìm thấy bằng cách sử dụng android: layout vượt trội so với Android: widgetLayout. Sử dụng widgetLayout, nút của tôi trở thành thứ mà tôi chỉ có thể mô tả là layout_alignParentRight = "true", nhưng hành vi đó đã biến mất khi sử dụng android: layout thay vào đó
JoeHz

1
Và tôi không thể có được điều này để kích hoạt trình xử lý sự kiện onPreferenceChange hoặc Click
JoeHz

38

Tôi muốn thêm một liên kết Thoát vào các tùy chọn và có thể sửa đổi mã của Jakar để làm cho nó hoạt động như thế này:

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

Ban đầu 'Ưu tiên' là một 'EditTextPreference' mà tôi chỉnh sửa bằng tay.

Sau đó vào lớp:

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
Công trình tuyệt vời. Thật tuyệt vời!
RRTW

8

Thêm vào

setContentView(R.layout.buttonLayout);

Phía dưới

addPreferencesFromResource(R.xml.yourPreference);

việc bố trí nút:

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

Nút truy cập bằng cách:

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

Bạn có thể lấy nút ở trên hoặc dưới màn hình bằng cách đặt nút trong RelativeLayout:

  • top_control_bar
  • bottom_control_bar

bottom_control_bar

Điều này làm việc cho tôi. Tôi hy vọng tôi có thể giúp ai đó với đoạn mã này.


Tôi đã sử dụng điều này trong ứng dụng của mình, nó giữ nút ở đầu danh sách trông đẹp hơn và thân thiện hơn với các nút OK và Hủy. Cảm ơn bạn.
Grux

1

Tôi không nghĩ có một cách dễ dàng để chỉ cần thêm Nút vào màn hình tùy chọn. Tùy chọn được giới hạn ở:

EditTextPreference
ListPreference
RingtonePreference
CheckboxPreference

Trong khi sử dụng màn hình tùy chọn, bạn bị giới hạn trong việc sử dụng các tùy chọn này và không có "tùy chọn nút" nào có thể dễ dàng sử dụng cho nhu cầu của bạn.

Tôi đã tìm kiếm chức năng tương tự, với việc thêm các nút vào màn hình tùy chọn, nhưng có vẻ như bạn cần xây dựng màn hình của riêng mình cho việc này, quản lý thay đổi thành tùy chọn trong việc triển khai của riêng bạn.


Có cùng một vấn đề, Nếu bạn muốn có một nút trong tùy chọn của mình, bạn phải sử dụng màn hình tự tạo trước :(
Janusz

1

Bạn có thể làm như thế này để truy cập vào nút!

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

Đừng quên thêm android:idvào linearLayout có chứa nút trong layoutButtons.xml , tức là 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!

đừng quên đánh dấu câu hỏi này là TRUE nếu bạn cảm thấy tôi đã giúp bạn trong đó?
Shah

0

Bạn cũng có thể tùy chỉnh bố cục của Tùy chọn bằng cách ghi đè Preference.onCreateView(parent). Ví dụ dưới đây sử dụng một lớp bên trong ẩn danh để tạo các tùy chọn màu đỏ.

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

Bạn có thể sử dụng kỹ thuật này để thêm một nút vào chế độ xem mặc định.


0

Nếu ai đó đến để hướng dẫn người dùng nhấp vào một trong các mục Tùy chọn và xử lý nhấp chuột đó và giải pháp của bạn dựa trên PreferenceFragmentCompat, thì bạn có thể làm điều này:

<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

Tạo một bố cục tùy chỉnh cho SettingsFragment.javatức làlayout_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>

Sau đó, tham khảo tệp bố cục trong 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>

Và sau đó, theo onViewCreated()phương pháp của bạn SettingsFragment.java, bạn có thể sử dụng nút như thế này:

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

Màn hình cài đặt mẫu có nút


-1

dùng thử android: onClick = "myMethod" hoạt động như một cơ duyên cho các sự kiện onclick đơn giản


4
Preferencekhông có onClicktài sản
ercan

Câu trả lời ngụ ý android:onClicktrong chế độ xem nút đính kèm, không phải trong sở thích.
Stan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.