编辑: 下面描述的问题是由于一个非常奇怪的设备问题不是由任何编码相关的问题引起的.
我有一个preferenceActivity,其中有很多checkBoxPreferences.checkBoxPreference假设保存默认的共享首选项文件,然后在我打开应用程序时再次调用以更新UI.
这不会像它想象的那样发生.如果我关闭应用程序并将其重新打开,我的值仍然像他们想象的那样,但如果我使用任务管理器来结束应用程序,或者如果我重新启动手机(当应用程序未运行时),则调用defaultValues再次.
所以,我在onResume()中创建了一个SharedPreference来测试它.
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
Run Code Online (Sandbox Code Playgroud)
然后我检查该共享首选项中是否有密钥.
pref.contains("myCheckBoxPreference");
Run Code Online (Sandbox Code Playgroud)
当我关闭并重新打开它时,它返回true.如果我与任务管理器关闭或关闭和打开电话,则返回false.
所以,我尝试手动设置SharedPreference
SharedPreferences.Editor editor = pref.edit();
editor.putBoolean("myCheckBoxPreference", myCheckBoxPreference.isChecked());
editor.commit();
Run Code Online (Sandbox Code Playgroud)
然后我在checkboxpreference值更改时调用了它.我也尝试在onStop和onPause中调用它.尽管如此,如果我关闭应用程序并将其重新打开,pref.contains将返回true,但如果我重新启动手机并重新打开,则返回false.
所以我尝试使用SharedPreferences文件.
在类声明中:
public static final String PREFS = "prefs";
Run Code Online (Sandbox Code Playgroud)
在onResume()中:
SharedPreferences pref = this.getSharedPreferences(PREFS, 0);
Run Code Online (Sandbox Code Playgroud)
同样的行为,如果我只是关闭应用程序并将其重新打开,pref.contains仍会返回true,但如果我关闭并重新打开手机,则返回false.
然后,我尝试myCheckBoxPreference的键值改变的东西,没有为CheckBoxPreference符合XML密钥,它仍然有同样的效果.
我从手机上卸下了应用程序,然后打开电源并重新打开,然后重新安装,它仍然具有相同的效果.
android taskmanager preference preferenceactivity sharedpreferences
我需要获取在xml布局中定义的EditText,该布局在首选项对话框中作为视图动态加载,即:
public class ReportBugPreference extends EditTextPreference {
@Override
protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
super.onPrepareDialogBuilder(builder);
builder.setView(LayoutInflater.from(ctx).inflate(R.layout.preference_report_bug_layout,null));
EditText edttxtBugDesc = (EditText) findViewById(R.id.bug_description_edittext); // NOT WORKING
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:解决方案由jjnFord
@Override
protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
super.onPrepareDialogBuilder(builder);
View viewBugReport = LayoutInflater.from(ctx).inflate(R.layout.preference_report_bug,null);
EditText edttxtBugDesc = (EditText) viewBugReport.findViewById(R.id.bug_description_edittext);
builder.setView(viewBugReport);
}
Run Code Online (Sandbox Code Playgroud) 我有一个SettingsActivity扩展PreferenceActivity到我的应用程序中显示设置.
有一个后退箭头,但它不起作用.
这是SettingsActivity.java文件的代码:
public class SettingsActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener{
private AppCompatDelegate mDelegate;
public static final String RESET_PASSWORD_KEY = "reset_password";
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
getDelegate().installViewFactory();
getDelegate().onCreate(savedInstanceState);
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
SharedPreferences sharedPreferencesCompat = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
Preference myPref = (Preference) findPreference(RESET_PASSWORD_KEY);
myPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference preference) {
//open browser or intent here
Intent resetPasswordActivityIntent = new Intent(SettingsActivity.this, ResetPasswordActivity.class);
startActivity(resetPasswordActivityIntent);
return true;
}
});
}
@Override
protected void onPostCreate(Bundle savedInstanceState) …Run Code Online (Sandbox Code Playgroud) android preferenceactivity android-preferences android-sharedpreferences
我有一个简单的ActionBarActivity,它包含一个PreferenceFragment,如下所示:
import android.app.Activity;
import android.os.Bundle;
import android.preference.PreferenceFragment;
public class SettingsActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
// Display the fragment as the main content.
getFragmentManager().beginTransaction()
.replace(R.id.fra_settings_container, new SettingsFragment()).commit();
}
public static class SettingsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的preferences.xml:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<ListPreference
android:defaultValue="15"
android:dialogTitle="@string/settings_heading_alarm_interval"
android:entries="@array/alarm_interval_entries"
android:entryValues="@array/alarm_interval_values"
android:key="alarm_interval"
android:title="@string/settings_heading_alarm_interval" />
<ListPreference
android:defaultValue="1"
android:dialogTitle="@string/settings_heading_alarm_type"
android:entries="@array/alarm_type_entries"
android:entryValues="@array/alarm_type_values"
android:key="alarm_type"
android:title="@string/settings_heading_alarm_type"
/>
<CheckBoxPreference …Run Code Online (Sandbox Code Playgroud) 我目前正在使用来自Web服务的内容动态地构建带有复选框的行列表.但是,这ListView需要做的事情几乎PreferenceActivity可以完成.
由于内容是动态的,我不知道行数,所以我不能CheckBoxPreference用XML 创建每一行.我如何建立PreferenceActivity一个CheckBoxPreference动态显示未知数字行?
使用PreferenceActivity,Android会自动保存简单的首选项,例如正在检查的复选框等.我有几个问题:
1 - 这些偏好在哪里得到保存?它与PreferenceManager.getDefaultSharedPreferences(Context)返回的首选项文件相同吗?
2 - 有没有办法使用不同的偏好设置?即使用context.getSharedPreferences(String name,int mode),您提供一个字符串来标识一组特定的首选项.是否可以在这样返回的一组首选项中保存PreferenceActivity的首选项?
先谢谢你,巴里
我正在尝试实现的是下面图像的基本和精确的复制品(我已经平方的偏好).按下首选项左侧的任何内容都应该打开一个对话框.按下togglebutton将禁用/启用我在此首选项中设置的任何内容.
我一直在努力工作几个小时,而且我空手而归.如何在PreferenceActivity中实现此功能?

编辑:似乎人们误解了我的问题.我弄清楚如何使用PreferenceActivity解决我的问题非常重要.不是活动.我不在乎我是需要用XML还是以编程方式来做.请不要向我提供我不能在类似内容中使用的答案.
编辑2:增加了赏金 - 我真的需要一个答案
我正在创建一个具有一些设置的应用程序,我想使用内置的PreferenceActivity或PreferenceFragment来完成工作
一些偏好有一个很长的标题,我无法缩短,而且我认为如果我本地化应用程序(翻译成多种语言),我将面临同样的问题(例如在德语中,有时会有很长的单词).
你在这种情况下得到的只是文本的开头,然后是"......"(或更少的点,这对btw没有多大意义).
例:

我知道PreferenceActivity从ListActivity扩展,所以我可以将其适配器更改为我想要的任何东西,但这将删除它的工作方式.
我也知道我可以从每个类型的首选项类扩展,使用"onCreateView"方法来引用创建的视图,然后访问它的子类,但这很奇怪,不是吗?我的意思是,它几乎就像假设它永远不会改变它的外观.
编辑:这是我尝试过的示例代码:
从每个首选项类扩展,并在每个首选项中使用:
...
@Override
protected View onCreateView(final ViewGroup parent)
{
final View view=super.onCreateView(parent);
ViewUtil.handlePreferenceTitleTextView(view);
return view;
}
...
//ViewUtil.java :
private void handlePreferenceTitleTextView(final View v)
{
final TextView titleTextView=(TextView)v.findViewById(android.R.id.title);
if(titleTextView!=null)
titleTextView.setSingleLine(false);
}
Run Code Online (Sandbox Code Playgroud)
它有效,但我不认为这是推荐的,因为Google可能会改变首选项视图的工作方式.
如何在Android上的首选项标题中处理长文本?
是否有可能使它具有椭圆形/选框(以便它将有一个动画来显示所有内容)?或者也许自动适合字体大小?或者将其设置为自动换行?还是一个水平scrollView,允许用户滚动阅读文本的其余部分?
是否可能有如何处理此类案件的惯例?也许长按一下可以看到整个文本的吐司/对话框?
android textview longtext preferenceactivity android-preferences
我已经实现了我的偏好,如官方指南中所示.
我有一个PreferenceActivity,可以像这样创建PreferenceFragment:
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Bundle extras = getIntent().getExtras();
if (extras != null)
{
Bundle bundle = new Bundle();
_widgetID = extras.getInt(GlobalSettings.EXTRA_WIDGET_ID);
bundle.putInt(GlobalSettings.EXTRA_WIDGET_ID, _widgetID);
WidgetSettingsFragment fragment = new WidgetSettingsFragment();
fragment.setArguments(bundle);
getFragmentManager().beginTransaction().replace(android.R.id.content,
fragment).commit();
}
}
Run Code Online (Sandbox Code Playgroud)
PreferenceFragment从资源加载首选项,它们包含一个首选项子屏幕,如下所示:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<!-- opens a subscreen of settings -->
<PreferenceScreen
android:key="button_voicemail_category_key"
android:title="@string/voicemail"
android:persistent="false">
<ListPreference
android:key="button_voicemail_provider_key"
android:title="@string/voicemail_provider" ... />
<!-- opens another nested subscreen -->
<PreferenceScreen
android:key="button_voicemail_setting_key"
android:title="@string/voicemail_settings"
android:persistent="false">
...
</PreferenceScreen>
<RingtonePreference
android:key="button_voicemail_ringtone_key"
android:title="@string/voicemail_ringtone_title"
android:ringtoneType="notification" ... />
...
</PreferenceScreen>
...
</PreferenceScreen>
Run Code Online (Sandbox Code Playgroud)
到目前为止这种方法效果很好,但现在我想 …
settings android preferences preferenceactivity preferencefragment
我有一个SettingsActivity扩展AppCompatPreferenceActivity.
我的pref_headers.xml看起来像这样:
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
<header
android:fragment="com.blabla.activities.fragments.ProfileFragment"
android:icon="@drawable/ic_users"
android:title="Profil">
</header>
</preference-headers>
Run Code Online (Sandbox Code Playgroud)
片段代码如下所示:
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class ProfileFragment extends PreferenceFragment {
@BindView(R.id.email)
TextView email;
@BindView(R.id.username)
TextView username;
@BindView(R.id.loadingPanel)
RelativeLayout loadingPanel;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_profile, container, false);
ButterKnife.bind(this, rootView);
if (setActionbarListener != null) {
setActionbarListener.setActionbarTitle("Profil");
}
loadingPanel.setVisibility(View.VISIBLE);
UsernameHandler uHandler = UsernameHandler.getInstance(new UsernameResult() {
@Override
public void finished(String uname) {
username.setText(uname);
loadingPanel.setVisibility(View.GONE); // hide loading spinner
}
});
email.setText(MainActivity.getFbUser().getEmail());
return rootView;
}
} …Run Code Online (Sandbox Code Playgroud) android ×10
preferences ×2
dynamic ×1
longtext ×1
preference ×1
settings ×1
taskmanager ×1
textview ×1
togglebutton ×1