web-dev-qa-db-ja.com

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

設定画面の下部にボタンを追加し、スクロール時にそれらを正しく機能させる方法はありますか?

107
vlaku

設定の外観をカスタマイズする別のソリューションがあります。

ボタンまたは標準の設定に追加するものを使用して、通常のXMLレイアウトを設計します。レイアウトにListViewを含め、ID @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で、次の2行をonCreateに追加します。

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

レイアウトのListViewは、res/xml/preferences.xmlで通常の方法で定義された設定に置き換えられます。

249
Max

私はこれが少し遅いことを知っていますが、私はちょうど私がマックスの賞賛されたソリューションよりも好きなソリューションを見つけました。

次のように、PreferenceActivityのListViewにフッター(またはボタンを一番上に配置したい場合はヘッダー)を追加するだけです。

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

これが誰かの助けになることを願っています。

56
jpihl

以下の例は、ページの下部にボタンをレンダリングします(誰かがまだ興味がある場合)。

LinearLayoutの場合、ウェイトを適用することもできます。これは、Listviewが* fill_parent *に設定されているために必要です。通常、これを行うには、* Android:layout_weight *を追加します。

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

Buttonには重みがないため、言うこともできます。ボタンは高さ0dpでレンダリングされます。

これで、layout_weigthsが追加され、ボタンがビューをレンダリングできる

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

実際、解決策があります。ここにコードがあります、これは誰にとっても役立つことを願っています。画面の解像度に関係なく、画面の下部にある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; 
    } 
}
7
vlaku

一般的なアクティビティ内でPreferenceFragmentを使用し、アクティビティレイアウトにボタンを追加するだけです。

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

enter image description here

2
Albert
 <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を使用して、listviewのlayout_heightの高さを設定し、ボタンのlayout_alignParentBottom = "true"を設定します。PreferenceScreenの下部にボタンをレンダリングできます。その後、@ Maxの方法を使用します。私のニーズに合っています。

1
Mejonzhan

これは、ronnyの例のアクティビティでコードがどのように見えるかです。私の意図は、画面の下部にメニューを配置することでした。

/** 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
user507410

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

Preference Activityのカスタムビュー これは、AndroidのPreferenceActivityにカスタムビューを追加するのに役立ちます。

Main.xmlを作成します。必要なビューは、IDがAndroid:id="@Android:id/list"のListViewのみです。

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

カスタムレイアウト内にPreferenceScreenコンテナを 'ラップ'するために作成したレイアウト(その後、ListViewの下にボタンを追加)が実際には機能しなかったため、上記の回答はすべて使用できません。

設定リストの上部にカスタムレイアウトを重ねるだけで(フローティング)、新しいカスタムボタンをクリック(たとえば)すると、ボタンの下の設定のみが呼び出されます。

しかし、 このソリューション が見つかりました。これは、PreferenceFragmentを使用するときに、設定リストコンテナの下にボタンを追加するのに役立ちます。

0
iaindownie

以下は、クリック可能なボタンを設定画面に追加する簡単なソリューションです。これは、プリファレンスがAndroid:widgetLayoutのスペースをすでに予約しており、ボタンがAndroid:onClickでクリックを渡すことができるため、簡単になります。

まず、コンテンツを含むbutton.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>

ここで、preferences.xmlに設定を追加します

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

PreferenceActivityにはonButtonClickメンバーのみを含める必要があります

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
ppareit

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
Dmitry