設定画面の下部にボタンを追加し、スクロール時にそれらを正しく機能させる方法はありますか?
設定の外観をカスタマイズする別のソリューションがあります。
ボタンまたは標準の設定に追加するものを使用して、通常の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
で通常の方法で定義された設定に置き換えられます。
私はこれが少し遅いことを知っていますが、私はちょうど私がマックスの賞賛されたソリューションよりも好きなソリューションを見つけました。
次のように、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));
}
}
これが誰かの助けになることを願っています。
以下の例は、ページの下部にボタンをレンダリングします(誰かがまだ興味がある場合)。
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
| +--
+--
実際、解決策があります。ここにコードがあります、これは誰にとっても役立つことを願っています。画面の解像度に関係なく、画面の下部にある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;
}
}
一般的なアクティビティ内で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
<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の方法を使用します。私のニーズに合っています。
これは、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
}
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>
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");
}
}
カスタムレイアウト内にPreferenceScreen
コンテナを 'ラップ'するために作成したレイアウト(その後、ListView
の下にボタンを追加)が実際には機能しなかったため、上記の回答はすべて使用できません。
設定リストの上部にカスタムレイアウトを重ねるだけで(フローティング)、新しいカスタムボタンをクリック(たとえば)すると、ボタンの下の設定のみが呼び出されます。
しかし、 このソリューション が見つかりました。これは、PreferenceFragment
を使用するときに、設定リストコンテナの下にボタンを追加するのに役立ちます。
以下は、クリック可能なボタンを設定画面に追加する簡単なソリューションです。これは、プリファレンスが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");
}
}
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) {
...
}
}
}