我使用了一个特殊的preferenceActivity实现,它允许使用标头并且也与旧的android版本兼容。我想要完成的是,我想在未选中ListPreferencea时重置a的值,但每当或被调用时,我都会得到。这是我的代码:CheckBoxPreferencesetValue()setEntries()null pointer Exception
import java.util.List;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Build;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
import android.preference.PreferenceManager;
import android.util.Log;
import com.actionbarsherlock.app.SherlockPreferenceActivity;
public class FragmentPreferences extends SherlockPreferenceActivity implements
OnSharedPreferenceChangeListener {
private static final String TAG = "FragmentPreferences";
private boolean themeIsDirty = false;
private ListPreference prefDspProfile;
@SuppressLint("NewApi")
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
setTheme(ActivityOriginal.THEME);
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
addPreferencesFromResource(R.xml.preference_general); …Run Code Online (Sandbox Code Playgroud) 我正在尝试实现 androidx SeekBarPreference,根据文档我可能能够setMax在我的 xml 中使用属性,但是这样做时我收到以下错误:
在xml中:
<SeekBarPreference
app:key="preference_key"
app:title="@string/preference"
app:showSeekBarValue="true"
app:setMax="10"/>
Run Code Online (Sandbox Code Playgroud)
错误:
root_preferences.xml:53: AAPT: error: attribute setMax (aka
gls.dev.MyApplication:setMax) not found.
Run Code Online (Sandbox Code Playgroud)
但是,在代码中设置属性时,它就像一个魅力:
findPreference<SeekBarPreference>("preference_key")?.apply {
max = 10
min = 1
seekBarIncrement = 1
isAdjustable = true
}
Run Code Online (Sandbox Code Playgroud) 只是测试Preferences DataStore并发现提供的Flow输出不会发出相同的值,我的设置如下:
数据存储实用程序类:
object DataStore {
private val Context.settings by preferencesDataStore("settings")
suspend fun saveBoolean(context: Context, keyResId: Int, value: Boolean) {
val key = booleanPreferencesKey(context.getString(keyResId))
context.settings.edit {
it[key] = value
}
}
fun getBooleanFlow(context: Context, keyResId: Int, defaultValueResId: Int): Flow<Boolean> {
val key = booleanPreferencesKey(context.getString(keyResId))
val defaultValue = context.resources.getBoolean(defaultValueResId)
return context.settings.data.map {
it[key] ?: defaultValue
}
}
}
Run Code Online (Sandbox Code Playgroud)
视图模型类:
class FirstViewModel(application: Application) : AndroidViewModel(application) {
private val uiScope = viewModelScope
val isUpdateAvailable = DataStore.getBooleanFlow(
getApplication(), R.string.is_update_available_key, R.bool.is_update_available_default …Run Code Online (Sandbox Code Playgroud) android android-preferences sharedpreferences kotlin-flow android-jetpack-datastore
我正在尝试将个别侦听器添加到a中的项目中,ListPreference但我找不到正确的代码来执行此操作.
例如,假设我有一个需要设置区域的应用程序 .所以我有ListPreference三个选择; 美洲,亚洲,欧洲.
当我使用触控板滚动项目时,我希望他们在获得焦点时说出偏好的文本.
我确信API中的某个地方我可以为各个项添加一个监听器,但我找不到它.(继承自)中有一个setOnPreferenceClickListener(..)方法,但是当您选择实际的父偏好项时.ListPreferenceDialogPreference
我需要编写一个特殊的子类吗?
编辑
在深入研究之后,我想我需要进一步澄清我的问题.使用首选项时,您可以覆盖中的onPreferenceTreeClick (PreferenceScreen prefScreen, Preference pref)方法PreferenceActivity.这允许您拦截对首选项的任何点击.但是我想在弹出的实际对话框中添加一个监听器.以上例子中的"美洲,亚洲,欧洲"选项.因此,如果我选择或点击亚洲,我可以拦截它.
所以我的(精炼)问题是如何为这些单独的选项添加一个监听器.
干杯
我知道Android能够创建一个用于更新共享首选项的Activity,但有没有办法在警告对话框中显示"Activity",以便首选项可以显示为"弹出窗口",而不是切换到自己的活动?
我希望这是有道理的....
我修改了CommonsWare的prefenceActivity应用程序但遇到了问题.
我想用菜单按钮启动prefenceActivity,然后用后退按钮完成它.
我有这个通过菜单按钮启动我的prefenceActivity:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
startActivity(new Intent(this, EditPreferences.class));
return(true);
}
Run Code Online (Sandbox Code Playgroud)
它确实会回到我对应用程序的主视图,但我认为它还没有完成,因为当我再次按下菜单按钮时,prefenceActivity不会弹出agian.我必须关闭我的应用程序,它只能再次使用一次.
当我按下后退按钮时,我已经尝试在我的prefenceActivity中完成它,但这也无济于事.
我做错了什么?
谢谢你的帮助!
我有以下代码从我的xml首选项文件中获取长值,
SharedPreferences getPrefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
long longBreak = Integer.parseInt(getPrefs.getString("breakTime", "8000"));
long shortBreak = Integer.parseInt(getPrefs.getString("breakTime", "5000"));
long workTime = Integer.parseInt(getPrefs.getString("workTime", "10000"));
Run Code Online (Sandbox Code Playgroud)
由于某种原因,我的LogCat显示"SharedPreference getPrefs = ...."行上的错误,我的android应用程序在加载长值之前中断....
我有我的偏好xml如下,
<ListPreference
android:entries="@array/workList"
android:entryValues="@array/workTimes"
android:key="workTime"
android:summary="Choose Work Time"
android:title="Work Time" />
<ListPreference
android:entries="@array/breakList"
android:entryValues="@array/breakTimes"
android:key="breakTime"
android:summary="Choose Break Time"
android:title="Break Time" />
Run Code Online (Sandbox Code Playgroud)
和我的数组值如下,
<string-array name="workList">
<item>25 Minutes</item>
<item>10 Seconds</item>
</string-array>
<string-array name="breakList">
<item>15 Minutes</item>
<item> 5 Minutes</item>
<item>8 Secs</item>
<item>5 Secs</item>
</string-array>
<string-array name="workTimes">
<item>1500000</item>
<item>10000</item>
</string-array>
<string-array name="breakTimes">
<item>900000</item>
<item>300000</item>
<item>8000</item>
<item>5000</item>
</string-array>
Run Code Online (Sandbox Code Playgroud)
我在差异应用程序中测试了相同的代码,它工作正常....任何帮助?提前致谢...
我有一个首选项屏幕(Fragment),它有一些从xml文件设置的首选项.我在其中调用的唯一内容Fragment是addPreferencesFromResource(R.xml.pref_main);onCreate方法.
现在,除了我的首选项中的"摘要"部分之外,一切都运行良好,例如,如果您有一个EditTextPreference并输入了一些文本,那么该文本应该在首选项下以较小的字母显示.
我正在使用自定义控件作为首选项(但它也不适用于任何官方首选项),这扩展了DialogPreference.如果我像这样设置摘要:
@Override
protected void onDialogClosed(boolean positiveResult) {
if (positiveResult) {
setSummary("Some summary");
}
}
Run Code Online (Sandbox Code Playgroud)
它的工作原理,但只要我不离开屏幕,当我返回时它不再存在.有任何想法吗?
我已将SettingsActivity添加到我的项目中.默认情况下,Android Studio创建了3个类别,包含3个标题.当我点击类别时,会出现新设置屏幕.我不希望这样.我的应用程序具有非常有限的settigns选项,所以我想只获得平面设置列表,没有任何标题和类别.
我发现的,不工作或弃用api.你能指点我,有效的方向如何实现平面设置屏幕而不使用任何弃用的api?
我按照文档上的说明使用Android Jetpack首选项库,但出现以下错误
java.lang.RuntimeException: Unable to start activity ComponentInfo{ ... activity.SettingsActivity}: java.lang.IllegalArgumentException: No view found for id 0x7f090111 (... :id/settings_container) for fragment SettingsFragment
...
Caused by: java.lang.IllegalArgumentException: No view found for id 0x7f090111 (... :id/settings_container) for fragment SettingsFragment
Run Code Online (Sandbox Code Playgroud)
因为我认为这通常发生在没有容器可装入片段的情况下,但是在我的情况下却有一个container(settings_container)。
我的代码如下所示
设置活动
class SettingsActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
supportFragmentManager
.beginTransaction()
.replace(R.id.settings_container, SettingsFragment())
.commit()
}
}
Run Code Online (Sandbox Code Playgroud)
设置片段
class SettingsFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.pref_main, rootKey)
}
Run Code Online (Sandbox Code Playgroud)
activity_settings.xml
<?xml …Run Code Online (Sandbox Code Playgroud)