PreferenceScreenにボタンを追加する方法は?


135

私はAndroid開発にかなり慣れていないので、プリファレンスに出会いました。それを見つけ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>

ボタンは2つEditTextPreferenceののすぐ下にある必要があります。

この問題の簡単な解決策はありますか?私が見つけた1つの解決策は、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()が、これはnullを返します。これらのボタンにアクセスする方法はありますか?



2
ところで、@ neelabhの答えは最も単純です。xml-layoutでイベントハンダーを指定することにより、必要な動作を実現できます。android:onClick="method"各ボタンに追加するだけpublic void method(View v)です。ここで、メソッドはとしてアクティビティで定義されています。
2013年

回答:


304

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

これは通常の設定のように表示され、タイトルと概要のみが表示されるため、属しているように見えます。

編集:私は使用して変更@string/myCoolButtonし、getString(R.string.myCoolButton)それがコンパイラの支援のためのリソースを使用するのが最適だから、言語翻訳、および文字列のしやすさが変化します。


7
プリロードされたGoogleアプリの多くはこのアプローチを使用しているため、それに従うことをお勧めします!標準の灰色のボタンが設定画面で適切ではないように見えるのを発見しました。そしてあなたのおかげで、標準化された見栄えにする良い方法を見つけました:)
Tom

5
android:key="key"findPreference("key");が同じキーを使用していることを確認してください。
リード

4
実際には、これはボタンをまったく表示しません。これはユーザーを混乱させ、OPが要求したものではありません。ボタンを実際に表示するための正しい答えは、Nicolasの答えです。
mutable2112

7
2011年に1:11に投稿したことに気づきました。はは。
リード

3
1か月と11日後にそれを行うべき
11/1

43

遅すぎると思います。これは、ボタン設定で行ったことです。

xmlフォルダー内のpreference.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。コードは機能しますが、1つの質問... PreferenceActivityを拡張するクラスでボタンが機能するようにするにはどうすればよいですか
SP

4
「resetButton」というIDを持つこのボタンを見つける方法を教えてください。ありがとうございます。
Ben Jima

android:widgetLayoutよりも優れたandroid:layoutを使用していることがわかりました。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 2013年

8

追加

setContentView(R.layout.buttonLayout);

未満

addPreferencesFromResource(R.xml.yourPreference);

buttonLayout:

<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

これでうまくいきました。このコードを使って誰かを助けたいと思います。


私はこれを自分のアプリで使用しました。ボタンがリストの一番上に表示され、見栄えが良くなり、[OK]ボタンと[キャンセル]ボタンがユーザーにとって使いやすくなりました。ありがとうございました。
Grux

1

設定画面にボタンを追加するだけの簡単な方法はないと思います。設定は以下に制限されています:

EditTextPreference
ListPreference
RingtonePreference
CheckboxPreference

設定画面を使用している間は、これらのオプションの使用に制限されており、必要に応じて簡単に使用できる単一の「ボタン設定」はありません。

設定画面にボタンを追加して、同様の機能を探していましたが、このために独自の画面を作成し、独自の実装で設定の変更を管理する必要があるようです。


同じ問題がありました。設定にボタンが必要な場合は、自作の設定画面を使用する必要があります:(
Janusz

1

このようにしてボタンにアクセスできます!

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

追加することを忘れないでくださいandroid:id内のボタンが含まのLinearLayoutに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

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

誰かがユーザーに設定項目の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;
}

コトリン:

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

以下のためのカスタムレイアウトを作成します。SettingsFragment.javaつまり、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>

次に、レイアウトファイルを参照します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
PreferenceonClickプロパティはありません
ercan 2014

答えandroid:onClickは、設定自体ではなく、アタッチされたボタンビューにあります。
2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.