如何在PreferenceScreen中添加按钮


Answers:


249

还有另一种用于定制首选项外观的解决方案。

使用按钮或您想要添加到标准首选项的任何内容设计标准的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,将这两行添加到您的onCreate

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

然后ListView,版式中的会被中的常规方式定义的首选项所取代res/xml/preferences.xml


10
将按钮置于列表视图下方时不起作用。当首选项活动使用对话框主题时,该功能不起作用。
格雷格·恩尼斯

11
developer.android.com/reference/android/preference/…上有关使用PreferenceActivity的最新文档提到,对于所有新开发,PreferenceFragment是实现的首选方法。似乎给定的解决方案在这种情况下不起作用。
Pankaj 2012年

4
它仍然不会随着列表滚动。
Sudarshan Bhat

7
我对这个答案有多少票感到困惑,因为它实际上并未回答原始问题。它不随列表滚动,并且将按钮置于视图底部时不起作用,如上面的注释中所述。
howettl

1
@howettl只是将ListView layout_height中的fill_parent更改为wrap_content
Martin Ch

56

我知道这有点晚了,但是我刚刚找到了一个比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));
    }
}

我希望这可以帮助别人。


2
作为Max的解决方案,至少它感觉更好,因为它不依赖元素ID。让我们看看它在未来的Android版本中的行为...
Daniel F

@DanielF。在您到达桥之前,不要过桥;)
jpihl 2012年

1
我无法ListView使用PreferenceFragment :(
–MichałK 2012年

1
不,它不能那样工作(因为PreferenceFragment它有自己的列表),但是我通过创建一个PreferenceIntent在上面设置一个来解决它。有没有必要建立(在我的情况下,至少)一个按钮
米哈尔ķ

1
不适用于PreferenceFragmentCompat,因为getListView实际上会返回RecyclerView
Mauker

11

下面的示例将在页面底部呈现一个按钮(以防仍然有人感兴趣)。

在使用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
| +--
+--

抱歉,错过了@stealthcopter的职位
罗尼

7

实际上,有一个解决方案。我希望这是一个代码,对任何人都有用。屏幕底部看起来像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; 
    } 
}

2

您只需要在常规Activity中使用PreferenceFragment并将按钮添加到Activity布局中即可。

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

在此处输入图片说明


我遵循了这个建议,它的确在视图的底部显示了按钮,但是它叠加在首选项列表的顶部,因此无法单击(即单击按钮只会激活下面的首选项)。
iaindownie '19

使用此解决方案不会触发
onClickListener

@rdehuyss,因为您需要将onClickListener添加到buttonSave:)
艾伯特(Albert)

1

这就是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
 <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的方式。它可以满足我的需求。


这是一个不错的解决方案,但是您忘记在按钮上方设置列表视图。当前,列表视图的项目可能位于按钮后面,因此不建议这样做,因为如果它是最后一项,则它将永远不可见,因此可以单击。
Android开发人员

哦,是的,您是对的,我忘记了这种情况,因为我的listview仅5个项目,谢谢。
Mejonzhan

请更新您的答案,以便其他人不会出现这种情况。
android开发人员

我认为您也忘记了relativeLayout的一些属性和结束标记。
android开发人员

实际上,设置正确的listview_height可以解决您所说的问题。
Mejonzhan

1

也可以将动作按钮添加到动作栏,以采用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>

0

首选项活动中的自定义视图 这将有助于在Android的PreferenceActivity中添加自定义视图。

创建main.xml,唯一必要的视图是ID为的ListView android:id="@android:id/list"

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

以下是将可点击按钮添加到首选项屏幕的简单解决方案。这很容易,因为首选项已经在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

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

我发现上述所有答案都无法使用,因为我创建了将布局“包装”到PreferenceScreen自定义布局中的容器的任何布局(然后在ListView)实际上均无效。

他们仅将自定义布局覆盖在首选项列表的顶部(浮动),并且单击(例如)新的自定义按钮将仅调用该按钮下方的首选项。

但是,我发现此解决方案在使用时可以为在首选项列表容器下方添加按钮提供一种便利PreferenceFragment

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.