gpt4 book ai didi

android - 我的 PreferenceScreen 上的 slider

转载 作者:IT王子 更新时间:2023-10-28 23:59:00 25 4
gpt4 key购买 nike

我希望我的偏好菜单有一些东西可以改变振动的持续时间。

prefs.xml 没有 slider 标签,那么最好的方法是什么?

最佳答案

我改进了 Macarse 提供的链接,使该值仅在单击确定按钮时保存,以便您可以在 XML 文件中使用 @string/... 值。

代码如下:

/* The following code was written by Matthew Wiggins 
* and is released under the APACHE 2.0 license
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Improvements :
* - save the value on positive button click, not on seekbar change
* - handle @string/... values in xml file
*/

package fr.atcm.carpooling.views.utils;

import android.app.AlertDialog;
import android.content.Context;
import android.os.Bundle;
import android.preference.DialogPreference;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.TextView;


public class SeekBarPreference extends DialogPreference implements SeekBar.OnSeekBarChangeListener, OnClickListener
{
// ------------------------------------------------------------------------------------------
// Private attributes :
private static final String androidns="http://schemas.android.com/apk/res/android";

private SeekBar mSeekBar;
private TextView mSplashText,mValueText;
private Context mContext;

private String mDialogMessage, mSuffix;
private int mDefault, mMax, mValue = 0;
// ------------------------------------------------------------------------------------------



// ------------------------------------------------------------------------------------------
// Constructor :
public SeekBarPreference(Context context, AttributeSet attrs) {

super(context,attrs);
mContext = context;

// Get string value for dialogMessage :
int mDialogMessageId = attrs.getAttributeResourceValue(androidns, "dialogMessage", 0);
if(mDialogMessageId == 0) mDialogMessage = attrs.getAttributeValue(androidns, "dialogMessage");
else mDialogMessage = mContext.getString(mDialogMessageId);

// Get string value for suffix (text attribute in xml file) :
int mSuffixId = attrs.getAttributeResourceValue(androidns, "text", 0);
if(mSuffixId == 0) mSuffix = attrs.getAttributeValue(androidns, "text");
else mSuffix = mContext.getString(mSuffixId);

// Get default and max seekbar values :
mDefault = attrs.getAttributeIntValue(androidns, "defaultValue", 0);
mMax = attrs.getAttributeIntValue(androidns, "max", 100);
}
// ------------------------------------------------------------------------------------------



// ------------------------------------------------------------------------------------------
// DialogPreference methods :
@Override
protected View onCreateDialogView() {

LinearLayout.LayoutParams params;
LinearLayout layout = new LinearLayout(mContext);
layout.setOrientation(LinearLayout.VERTICAL);
layout.setPadding(6,6,6,6);

mSplashText = new TextView(mContext);
mSplashText.setPadding(30, 10, 30, 10);
if (mDialogMessage != null)
mSplashText.setText(mDialogMessage);
layout.addView(mSplashText);

mValueText = new TextView(mContext);
mValueText.setGravity(Gravity.CENTER_HORIZONTAL);
mValueText.setTextSize(32);
params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
layout.addView(mValueText, params);

mSeekBar = new SeekBar(mContext);
mSeekBar.setOnSeekBarChangeListener(this);
layout.addView(mSeekBar, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));

if (shouldPersist())
mValue = getPersistedInt(mDefault);

mSeekBar.setMax(mMax);
mSeekBar.setProgress(mValue);

return layout;
}

@Override
protected void onBindDialogView(View v) {
super.onBindDialogView(v);
mSeekBar.setMax(mMax);
mSeekBar.setProgress(mValue);
}

@Override
protected void onSetInitialValue(boolean restore, Object defaultValue)
{
super.onSetInitialValue(restore, defaultValue);
if (restore)
mValue = shouldPersist() ? getPersistedInt(mDefault) : 0;
else
mValue = (Integer)defaultValue;
}
// ------------------------------------------------------------------------------------------



// ------------------------------------------------------------------------------------------
// OnSeekBarChangeListener methods :
@Override
public void onProgressChanged(SeekBar seek, int value, boolean fromTouch)
{
String t = String.valueOf(value);
mValueText.setText(mSuffix == null ? t : t.concat(" " + mSuffix));
}

@Override
public void onStartTrackingTouch(SeekBar seek) {}
@Override
public void onStopTrackingTouch(SeekBar seek) {}

public void setMax(int max) { mMax = max; }
public int getMax() { return mMax; }

public void setProgress(int progress) {
mValue = progress;
if (mSeekBar != null)
mSeekBar.setProgress(progress);
}
public int getProgress() { return mValue; }
// ------------------------------------------------------------------------------------------



// ------------------------------------------------------------------------------------------
// Set the positive button listener and onClick action :
@Override
public void showDialog(Bundle state) {

super.showDialog(state);

Button positiveButton = ((AlertDialog) getDialog()).getButton(AlertDialog.BUTTON_POSITIVE);
positiveButton.setOnClickListener(this);
}

@Override
public void onClick(View v) {

if (shouldPersist()) {

mValue = mSeekBar.getProgress();
persistInt(mSeekBar.getProgress());
callChangeListener(Integer.valueOf(mSeekBar.getProgress()));
}

((AlertDialog) getDialog()).dismiss();
}
// ------------------------------------------------------------------------------------------
}

编辑:

这是截图:

Screenshot SeekBarPreference

编辑:根据 arlomedia 的要求,这里是所有需要的代码(我刚刚重新创建了一个新项目,它运行良好。我纠正了 SeekBarPreference 类中的一些错误,所以不要忘记重新复制/粘贴它) :

主要 Activity :

package fr.at.testsliderpref;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {

getMenuInflater().inflate(R.menu.main, menu);
return true;
}

@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {

switch(item.getItemId()) {

case R.id.menu_settings : {

startActivity(new Intent(this, SettingsActivity.class));

break;
}
}

return true;
}
}

设置 Activity :

package fr.at.testsliderpref;

import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import fr.at.testsliderpref.utils.SeekBarPreference;

public class SettingsActivity extends PreferenceActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {

// Call super :
super.onCreate(savedInstanceState);

// Set the activity's fragment :
getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit();
}


public static class SettingsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener {

private SeekBarPreference _seekBarPref;

@Override
public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.activity_settings);


// Get widgets :
_seekBarPref = (SeekBarPreference) this.findPreference("SEEKBAR_VALUE");

// Set listener :
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);

// Set seekbar summary :
int radius = PreferenceManager.getDefaultSharedPreferences(this.getActivity()).getInt("SEEKBAR_VALUE", 50);
_seekBarPref.setSummary(this.getString(R.string.settings_summary).replace("$1", ""+radius));
}

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {

// Set seekbar summary :
int radius = PreferenceManager.getDefaultSharedPreferences(this.getActivity()).getInt("SEEKBAR_VALUE", 50);
_seekBarPref.setSummary(this.getString(R.string.settings_summary).replace("$1", ""+radius));
}
}
}

布局>activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/textview_text" />

</RelativeLayout>

菜单> main.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

<item
android:id="@+id/menu_settings"
android:title="@string/menu_settings"
android:icon="@android:drawable/ic_menu_preferences"/>

</menu>

xml > Activity 设置.xml:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

<fr.at.testsliderpref.utils.SeekBarPreference
android:defaultValue="50"
android:dialogMessage="@string/settings_dialog_message"
android:key="SEEKBAR_VALUE"
android:max="100"
android:summary="@string/settings_summary"
android:text="@string/settings_unit"
android:title="@string/settings_title" />

</PreferenceScreen>

值 > strings.xml :

<?xml version="1.0" encoding="utf-8"?>
<resources>

<string name="app_name">TestSliderPref</string>
<string name="textview_text">SeekBarPreference test</string>

<string name="menu_settings">Settings</string>
<string name="settings_dialog_message">Here comes a message</string>
<string name="settings_summary">Current value is $1</string>
<string name="settings_unit">Km</string>
<string name="settings_title">Here comes the title</string>

</resources>

别忘了将你的 SettingsActivity 添加到 list 中,应该没问题。

关于android - 我的 PreferenceScreen 上的 slider ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1974193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com