当我尝试使用Android的开发人员指南和教程使用"首选项"创建"设置活动"时,我收到警告,例如:
"不推荐使用PreferenceActivity类型的方法addPreferencesFromResource(int)"
对于代码中的这两行:
getPreferenceManager().setSharedPreferencesName(PREFS_NAME);
addPreferencesFromResource(R.xml.default_values);
Run Code Online (Sandbox Code Playgroud)
我知道这些只是警告,但是当我运行我正在设计的应用程序时,我想知道它们现在还是将来是否会引起任何问题.
public class DefaultValues extends PreferenceActivity {
static final String PREFS_NAME = "defaults";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getPrefs(this);
getPreferenceManager().setSharedPreferencesName(PREFS_NAME);
addPreferencesFromResource(R.xml.default_values);
}
static SharedPreferences getPrefs(Context context) {
PreferenceManager.setDefaultValues(context, PREFS_NAME, MODE_PRIVATE,
R.xml.default_values, false);
return context.getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
}
}
Run Code Online (Sandbox Code Playgroud) android deprecated preferenceactivity android-preferences sharedpreferences
这是我的偏好活动:
package com.example.hms.test;
import android.os.Bundle;
import android.preference.PreferenceActivity;
public class PrefsActivity extends PreferenceActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.prefs);
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,我想显示一个带有名称设置的操作栏和一个回到主页的后退按钮
我发现一些线程报告了类似的问题,但它们都没有真正提供我尚未尝试过的东西.
一个无辜的这样的电话:
mActivity.startActivity(new Intent(mActivity, MyEditPreferences.class));
Run Code Online (Sandbox Code Playgroud)
在AndroidManifest.xml中使用以下内容:
<application>
<activity android:name="MyActivityLib" />
<activity android:name="com.example.baseapp.MyEditPreferences" android:label="@string/app_name">
</activity>
</application>
Run Code Online (Sandbox Code Playgroud)
触发以下异常:
06-14 14:06:50.297: ERROR/AndroidRuntime(9272):
android.content.ActivityNotFoundException: Unable to find explicit activity class
{com.example.baseapp.paypal/com.example.baseapp.MyEditPreferences};
have you declared this activity in your AndroidManifest.xml?
Run Code Online (Sandbox Code Playgroud)
问题是,在将代码从单个应用程序项目更改为由库项目和应用程序项目组成的由两部分组成的项目之前,此代码用于完美地工作.
AndroidManifest.xml是库项目中的一个.
我需要做什么来消除这个ActivityNotFoundException?
在PreferenceActivity中,我们可以使用XML代码定义Preferences.其中之一是:
android:dependency
Run Code Online (Sandbox Code Playgroud)
如果启用了复选框或类似选项,则可以使用此选项将首选项设置为仅敏感.但是,有没有办法设置屏幕,以便只有在未检查某个框时才能获得首选项- 实际上与上述相反?
我想获取用于在我的PreferenceActivity中显示特定首选项的View实例,因此我可以修改其属性,例如:
public class SettingsActivity extends PreferenceActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preference);
Preference pref = findPreference("key");
pref.getView().setVisibility(View.GONE);
//not necessarily setVisibility, i hope you get my point
}
}
Run Code Online (Sandbox Code Playgroud)
我只找到了这个方法: getView(View convertView,ViewGroup parent).但是对我来说似乎很困惑,如果我想获得我的偏好视图,我需要提供视图和viewGroup作为参数?
有人可以解释如何使用此方法,或指向另一种方法从我的Preference实例获取View.
PS:如果可能的话,我宁愿不扩展Preference类,但如果有必要,我不介意
除了一件事,我的PreferenceActivity工作得很好.ActionBar图标完美地将用户返回到我所有其他活动中的上一个活动,但在PreferenceActivity中不起作用.当我点击图标时,它会闪烁,好像它将返回上一个活动,但PreferenceActivity保留在屏幕上.有趣的是,后退按钮确实将用户返回到上一个活动.有没有办法让ActionBar的Home图标在PreferenceActivity中"正常"工作?
这是代码:
public class SettingsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Set actionBar controls for Settings
TextView actionBarTitle = (TextView) findViewById(Resources.getSystem().getIdentifier("action_bar_title", "id", "android"));
ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
actionBar.setIcon(R.drawable.ic_launcher);
actionBar.setDisplayShowTitleEnabled(true);
actionBarTitle.setTextColor(Color.WHITE);
actionBarTitle.setTextSize(16);
actionBar.setTitle(R.string.settings_menu_title);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { //Build.VERSION_CODES.ICE_CREAM_SANDWICH
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true); // show back arrow on title icon
actionBar.setDisplayShowHomeEnabled(true);
}
...... Handle prefs (all working fine).....
}
Run Code Online (Sandbox Code Playgroud)
}
//////和电话代码////////
//Use menu button to access settings screen
@Override
public boolean onKeyDown(int keycode, KeyEvent e) { …Run Code Online (Sandbox Code Playgroud) 我有一个有两个活动的应用程序:MainActivity和SettingsActivity.MainActivity有一个菜单,其中包含一个"设置"菜单项.单击此菜单项时,它会以意图启动SettingsActivity.活动开始后,我点击左上角的后退按钮,没有任何反应.我假设自从使用intent启动活动后,活动堆栈将自动管理.我想回到MainActivity.这个假设我错了吗?
MainActivity.onMenuItemSelected
public boolean onMenuItemSelected(int featureId, MenuItem item) {
int itemID = item.getItemId();
if(itemID == R.id.settings) {
Intent intent = new Intent(this, SettingsActivity.class);
startActivity(intent);
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
SettingsActivity
public class SettingsActivity extends PreferenceActivity {
public static final String TEST = "test";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
}
Run Code Online (Sandbox Code Playgroud) 从KitKat发布以来,我注意到我的一大堆应用更新了"修复Kit Kat的崩溃".最近,当我发布自己的应用程序时,我发现可能的来源是使用首选项活动的新"isValidFragment"要求.然而,我无法让任何人解释为什么突然需要这个新类来验证片段.任何人都可以向我解释为什么需要它吗?
使用最新的AppCompat-v21库,我曾经ActionBarActivity创建和填充PreferenceFragment.但是,ActionBar当方向或屏幕大小改变时,似乎不会改变高度和文本大小.对其他活动进行测试,这种行为似乎只发生在PreferenceActivity(与此处提出的问题相反:ActionBar容量/溢出不会改变方向变化).
首先,为了处理方向的变化,我加入android:configChanges="keyboard|keyboardHidden|orientation|screenSize"了Manifest.我怀疑这是造成这个问题的主要原因,但正如我之前提到的,这适用于其他问题Activity.
以下是一些解释此问题的屏幕截图:
PreferenceActivity以纵向模式启动:

从肖像旋转到风景:

PreferenceActivity以横向模式启动:

从风景旋转到肖像:

附加信息
这是PreferenceActivity班级:
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
public class PrefsActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getFragmentManager().beginTransaction().replace(android.R.id.content, new PrefsFragment()).commit();
}
}
Run Code Online (Sandbox Code Playgroud)
这种行为是个错误吗?如果没有,是否有解决方法或修复?
我尝试使用新的ToolBar小部件,但没有运气.
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.Toolbar;
public class PrefsActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_preference);
Toolbar toolbar = …Run Code Online (Sandbox Code Playgroud) android android-appcompat preferenceactivity android-orientation android-actionbar
我有一堆(Sub)PreferenceScreens的PreferenceActivity.每个这样的(Sub)PreferenceScreen代表一个帐户并且具有帐户 - 用户名作为其标题.
PreferenceScreen root = mgr.createPreferenceScreen(this);
for (MyAccountClass account : myAccounts) {
final PreferenceScreen accScreen = mgr.createPreferenceScreen(this);
accScreen.setTitle(account.getUsername());
// add Preferences to the accScreen
// (for instance a "change username"-preference)
...
root.add(accScreen);
}
Run Code Online (Sandbox Code Playgroud)
当用户输入子PreferenceScreen并编辑帐户用户名时,我希望外部PreferenceScreen更新它的相关帐户的PreferenceScreen标题.
我试图添加......
usernamePref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
accScreen.setTitle(newValue.toString());
return true;
}
});
Run Code Online (Sandbox Code Playgroud)
...但是accScreen.setTitle似乎对外部PreferenceScreen没有生效.我注意到调用onContentChanged();实际上使它工作,但我意识到这可能不是这样做的首选方式.
我怀疑我应该postInvalidate()在某个地方调用一些视图,但我真的无法弄清楚什么视图以及何时进行操作.
PreferenceScreen android:摘要更新!可能正在经历与我相同的问题.
任何帮助赞赏.
android ×10
back ×1
deprecated ×1
invalidation ×1
java ×1
preference ×1
preferences ×1
view ×1