我刚刚注意到这个方法在Android的文档(参考文献)中addPreferencesFromResource(int preferencesResId)被标记为已弃用.
不幸的是,该方法的描述中没有提供替代方法.
为了将preferenceScreen.xml连接到匹配的PreferenceActivity,应该使用哪种方法?
我突然停止了我的应用程序的开发,因为我意识到这个库中不支持PreferenceFragments.新手Android开发人员可以使用任何替代方案来克服这个障碍吗?
这是我现在的主要窗口
<?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">
<TabHost
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="0"/>
<FrameLayout
android:id="@+android:id/realtabcontent"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
</LinearLayout>
<TabWidget
android:id="@android:id/tabs"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0"
/>
</TabHost>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
对于我的TabActivity,我使用的是我在网上找到的东西.这是一个片段:
public class TabControlActivity extends FragmentActivity implements TabHost.OnTabChangeListener
{
public static final int INSERT_ID = Menu.FIRST;
public static TabControlActivity thisCtx;
private TabHost mTabHost;
private HashMap mapTabInfo = new HashMap();
private TabInfo mLastTab = null;
private class TabInfo {
private String …Run Code Online (Sandbox Code Playgroud) 在ApiDemos for Android 4.0中尝试不同的首选项活动,我在代码中看到,例如,在PreferencesFromCode.java中不推荐使用某些方法.
所以我的问题是:如果我使用PreferenceFragment,它是适用于所有版本还是仅适用于3.0或4.0及更高版本?
如果是这样,我应该使用哪种适用于2.2和2.3呢?
我已定义dialogfragments(因为Android文档说它更好,确实是这样)但现在我想用它PreferenceActivity.
问题是我不能getSupportFragmentManager()在那里使用,我不能使用PreferenceFragment,因为它不兼容兼容库.看起来像一个路障场景.
任何人都可以就此提出建议吗?
我的android应用程序使用兼容性库(Loaders特别是).我需要能够在任何地方使用兼容性组件,包括我的PreferenceActivity.遗憾的是,支持库不包括基于片段的类PreferenceActivity,也不包括PreferenceFragment类.
我想要创建自己的PreferenceFragmentActivity和CompatPreferenceFragment(基本上是谷歌忽略的).其他人,包括StackOverflow上的一些人,已经提到完成这个确切的事情,所以我公开寻求任何形式的帮助 - 指导,提示,建议,代码示例(如果您愿意并且能够分享),或者您认为的任何其他内容与这个问题有关.
如果有人也可以将我引导到人们提交Android功能请求的网站,我想将我的名字添加到希望Google在支持库的未来版本中解决此问题的人员列表中.
注意:请节省一些时间并参考接受的答案,无需阅读所有问题.
您可以阅读问题的其余部分以及我提供的替代(尽管不太复杂)方法的答案.
此外,您可能希望通过将相关的代码片段添加到您的首选项活动类中来利用Android 2.X中背景故障的修复程序.
背景
作为Android编码的新手,但在其他编程语言/框架方面有一定经验,我期待我的Android应用程序编码将是一个相当愉快的编程.就是这样,直到我偶然发现了这个问题:
Android项目的Eclipse向导表明,如果我将最小API设置为8(Android 2.2),我可以达到95%的设备.无论如何我都不需要用我的应用做任何花哨的事情,所以我想,"当然,为什么不呢?".一切都还可以,除了偶尔我会发现在最近的API版本中不推荐使用的几个方法/类,所以我不得不设法继续使用旧设备的旧方法,并尝试尽可能多地使用新设备更新Android版本的方法.这是一个这样的场合.
在使用Eclipse向导创建首选项活动之后,我意识到Eclipse预编译器/解析器/检查器(或其他任何名称)Lint会抱怨无法使用在旧API版本中创建/管理首选项的新方法.所以我想,"好吧,拧紧新的方法.让我们以旧的方式去做,因为新的API版本应该向后兼容,它应该没问题",但事实并非如此.旧方法使用标记为已弃用的方法/类; 对我来说,这意味着,即使它们仍然在当前的API中工作,它们也会在将来的版本中停止工作.
所以我开始寻找正确的方法,最后点击此页面:在PreferenceActivity中使用什么而不是"addPreferencesFromResource"?Garret Wilson解释了一种以与新方式兼容的方式使用旧的首选屏幕资源的方法.这很棒,最后我觉得我可以继续使用我的应用程序编码,除非它在定位旧API时不起作用,因为它使用了更新的API代码.因此,我必须设计一种方法,使其适用于旧的API和更新的API.经过一段时间的修补后,我设法找到了一种方法,通过使用预编译器(或其他任何名称)注释和伟大的getClass().getMethod()以及异常.
在创建首选项子屏幕之前,一切似乎都完美无瑕.它在较新的Android版本中正确显示,但是当我尝试使用旧版本时,我只能看到黑屏.经过大量搜索后,我发现此页面解释了这个问题:http://code.google.com/p/android/issues/detail?id = 4611这显然是一个众所周知的故障,它已经在几个Android版本中出现了很长时间.我阅读了整个帖子并找到了几个问题的解决方案,但我真的不完全喜欢它们中的任何一个.就我而言,我更愿意尽可能避免使用静态内容,并以编程方式执行操作.我更喜欢自动化而非重复性工作.一些解决方案建议将子屏幕创建为父屏幕,然后将它们添加到清单文件中,并通过意图从父屏幕调用它们.我真的很讨厌跟踪那些事情:清单中的条目,分离的屏幕资源文件,意图......所以这对我来说是禁忌.我一直在寻找并找到了一种我更喜欢的程序化方法......却发现它不起作用.它包括迭代首选屏幕的整个视图树并为偏好子屏幕分配适当的背景,但它只是不起作用,因为我后来在经过大量调试后发现,偏好子屏幕视图不是偏好屏幕视图的子项.我必须找到一种方法来实现这一目标.我尝试了许多我能想到的东西,研究和研究无济于事.我几次濒临放弃,但经过两周的持续努力和大量调试后,我找到了一个解决方法,我在评论#35中发布了这个.
意见
这真的不是完美的解决方案/方法,我知道它的一些缺点,但它是有效的,所以我决定分享它.希望我的热情并不是太荒谬,因为我知道任何经验丰富的编码员都可以解决这个问题并不是很重要.但是,嘿,我认为分享知识会让我好一点,无论我吹嘘多少,都比一个经验丰富的编码员能让自己保持一切.只是分享我的意见,因为我无法相信以前没有人遇到过这个问题,但我确实相信很多人已经拥有它并且没有费心去分享他们的知识.
我在答案中提出了一个建议的类,用于Android的几个版本,以及一些有关其用法的建议.我愿意接受讨论和贡献,以使其成为更好的课程.
已知的问题:
compatibility android backwards-compatibility android-preferences
我正在尝试使用Android兼容包v4将基于片段的设计替换为我的应用程序中的TabActivity.
我遇到的问题是我的TabActivity中的一个选项卡是PreferencesActivity,由于显而易见的原因,我无法从FragmentActivity启动它.
所以,既然,PreferenceFragment没有包含在Android兼容包中,我也无法从我的片段活动中启动PreferenceActivity,我该怎么办?
对任何建议开放.
编辑:尝试从我的片段活动打开PreferenceActivity时得到的异常在这里:
FATAL EXCEPTION: main
java.lang.IllegalStateException: Did you forget to call 'public void setup(LocalActivityManager activityGroup)'?
at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:652)
at android.widget.TabHost.setCurrentTab(TabHost.java:326)
at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:132)
at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:456)
at android.view.View.performClick(View.java:2485)
at android.view.View$PerformClick.run(View.java:9080)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3683)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)
我的FragmentActivity代码如下(大部分内容来自'tabs'的兼容包v4示例):
EDIT2:为了清楚起见,还添加了示例代码:
import java.util.HashMap;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TabHost;
import android.widget.TextView;
public class …Run Code Online (Sandbox Code Playgroud) 当我在PreferenceFragment中点击一个Preference时,我正试图调出一个DialogFragment.不幸的是,当我在DialogFragment.show()中调用getFragmentManager()时,我收到以下错误:
无法解析方法'show(android.app.FragmentManager,java.lang.String)'
问题是我似乎无法从这个片段中引用android.support.v4.app.FragmentManager.负责这个片段的活动从FragmentActivity延伸,但显然这还不够.我也试过调用getSupportFragmentManager(),但这给了我这个错误:
无法解析方法'getSupportFragmentManager()'
我怎样才能做到这一点?
这是一些代码:
gPrefAcknowledgements.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener()
{
@Override
public boolean onPreferenceClick(Preference preference)
{
DialogAcknowledgements dialogAck = new DialogAcknowledgements();
dialogAck.show(getFragmentManager(), "acknowledgements");
return true;
}
});
Run Code Online (Sandbox Code Playgroud)