我正在使用兼容性库转换应用程序以使用片段.现在我有许多活动(ABCD)相互链接,D有一个按钮'OK',当按下调用完成然后冒泡onActivityResult()到另外销毁C和B.
对于我的前Honycomb片段版本,每个活动实际上是片段Af Bf Cf Df的包装器.所有活动都是通过每个片段发起的,startActivityForResult()并且onActivityResult()可以愉快地调用getActivity().finish()
我遇到的问题是在我的Honeycomb版本中我只有一个活动,A,并且片段Bf,Cf,Df使用FragmentManager.
我不明白的是,当按下"确定"以删除片段Df,Cf和Bf时,在Df中该怎么办?
我尝试让片段从堆栈中弹出,但这会导致异常.onActivityResult()是没用的,因为我没有使用加载片段startActivityForResult().
我是否完全以错误的方式思考这个问题?我是否应该实现某种与父片段或活动进行通信的侦听器,以便使用事务管理器进行弹出?
我正在使用Android兼容性库来实现片段并扩展了布局示例,以便片段包含一个触发另一个片段的按钮.
在左侧的选择窗格中,我有5个可选项 - A B C D E.
每个都FragmentTransaction:replace在详细信息窗格中加载一个片段(via ) -a b c d e
现在我扩展了片段e以包含一个按钮,该按钮e1还会在详细信息窗格中加载另一个片段.我在片段e的onClick方法上做了这个,如下所示:
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.replace(R.id.details_frag, newFrag);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();
Run Code Online (Sandbox Code Playgroud)
如果我做出以下选择:
E - e - e1 - D - E
Run Code Online (Sandbox Code Playgroud)
然后片段e在详细信息窗格中.这很好,我想要的.但是,如果我back在此时按下按钮它什么都不做.我必须点击两次,因为e1它仍然在堆栈上.点击后我在onCreateView中得到一个空指针异常:
为了"解决"这个问题,无论何时A B C D E选择,我都添加了以下内容:
FragmentManager fm = getActivity().getSupportFragmentManager();
for(int i = 0; i < fm.getBackStackEntryCount(); ++i) {
fm.popBackStack();
}
Run Code Online (Sandbox Code Playgroud)
只是想知道这是否是正确的解决方案或我是否应该做一些不同的事情?
基本上我Handler在我的消息中Fragment收到一堆消息,这些消息可能导致对话框被解除或显示.
当应用程序进入后台时,我得到了一个,onPause但仍然可以像我们期望的那样得到我的消息.但是,因为我正在使用片段,所以我不能只关闭并显示对话框,因为这将导致一个IllegalStateException.
我不能只是解雇或取消允许国家损失.
鉴于我有一个Handler我想知道是否有一个推荐的方法,我应该如何在暂停状态下处理消息.
我正在考虑的一个可能的解决方案是记录暂停时播放的消息并将其播放回来onResume.这有点令人不满意,我认为框架中必须有一些东西可以更优雅地处理这个问题.
我有一只猴子撞车了
java.lang.IllegalStateException: Failure saving state: FragmentB has target not in fragment manager: FragmentA
at android.support.v4.app.FragmentManagerImpl.saveAllState(FragmentManager.java:1561)
at android.support.v4.app.FragmentActivity.onSaveInstanceState(FragmentActivity.java:475)
at com.acme.ParentActivity.onSaveInstanceState(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
基本上,FragmentA加载FragmentB并setTargetFragment调用它来设置FragmentB的目标片段.
然后,FragmentB只需调用getTargetFragment其onCreate方法并在需要时挂起到目标.
现在,我没有做任何的任何东西onSaveInstanceState在它设置为空,做任何方面与目标片段电话saveFragmentInstanceState,putFragment等电话.问题是我应该用它做些什么吗?
提前致谢,
彼得.
**编辑1**我使用旧版本的支持库,并且感觉这可以在最新版本中修复,如果是这种情况,将进一步测试并提供进一步的更新.但是,仍然有兴趣知道我是否应该对我目前没有做的目标片段做任何事情.
**编辑1**已修复支持库的版本8(尚未尝试其他版本).
我很欣赏有关轮换更改的AsyncTask的大量帖子.使用兼容性lib并试图解雇DialogFragmentin 时,我有以下问题onPostExecute.
我有一个片段,它触发AsyncTask显示进度DialogFragment,然后onPostExecute解散对话框然后可能抛出另一个DialogFragment.
如果在显示进度对话框时我把应用程序放到后台我得到了以下片段:
1) onPause
2) onSaveInstanceState
3)onPostExecute我尝试解雇并调用对话框.
我得到一个IllegalStateException因为我正在尝试在活动保存状态时有效地提交事务并且我理解这一点.
在轮换中,我假设(可能不正确)onPostExecute在重新创建活动之前我不会得到.但是,当把应用程序放到后台时,我假设(肯定是错误的)onPostExectute在片段/活动暂停时不会被调用.
我的问题是,我的解决方案是简单地检测onPostExecute到片段/活动暂停并简单地执行我需要做的事情onResume吗?对我来说似乎有些难看.
提前谢谢,彼得.
编辑1
需要支持2.1及以上版本
编辑2
我已经考虑过使用对话框FragmentTransaction:add,FragmentTransaction:commitAllowingStateLoss但这并非没有问题.
android android-lifecycle android-asynctask android-fragments
Android 2.3+中的浏览器在维护已更改方向的内容滚动位置方面做得很好.
我正在尝试为WebView实现相同的功能,我在一个活动中显示但没有成功.
我已经测试了清单更改(android:configChanges ="orientation | keyboardHidden")以避免旋转时的活动重新创建,但是由于不同的宽高比,滚动位置没有设置到我想要的位置.此外,这不是我的解决方案,因为我需要在纵向和横向上有不同的布局.
我已经尝试保存WebView状态并恢复它,但这会导致内容再次显示在顶部.
此外,即使此时WebView的高度不为零,尝试滚动onPageFinished使用scrollTo也不起作用.
有任何想法吗?提前致谢.彼得.
部分解决方案:
我的同事设法通过JavaScript解决方案进行滚动工作.对于简单滚动到相同的垂直位置,WebView的"Y"滚动位置将保存在onSaveInstanceState状态中.然后将以下内容添加到onPageFinished:
public void onPageFinished(final WebView view, final String url) {
if (mScrollY > 0) {
final StringBuilder sb = new StringBuilder("javascript:window.scrollTo(0, ");
sb.append(mScrollY);
sb.append("/ window.devicePixelRatio);");
view.loadUrl(sb.toString());
}
super.onPageFinished(view, url);
}
Run Code Online (Sandbox Code Playgroud)
当内容从开始跳转到新的滚动位置时,你会得到轻微的闪烁,但它几乎不会引起注意.下一步是尝试基于百分比的方法(基于高度的差异),并调查WebView保存并恢复其状态.
我有一个Activity在配置更改(所需)上重新创建的.我有一个在布局中使用单个DialogFragment调用.setRetainInstance(true)EditText
在DialogFragment中,onActivityCreated我打电话给:
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
Run Code Online (Sandbox Code Playgroud)
A)如果我打开键盘然后当我将应用程序放入背景然后将其带到foregournd然后我希望键盘仍然显示.
B)如果我关闭键盘(EditText仍有焦点并显示所需行为的光标),那么如果我将应用程序放入背景然后将其带到前台,我希望键盘仍然关闭.
我似乎无法同时实现A)和B).当我将应用程序带到前台时,键盘始终处于关闭状态.我试过.SOFT_INPUT_STATE_ALWAYS_VISIBLE但键盘始终打开.
提前感谢您对我如何实现这一目标的任何建议.我也希望在旋转时保持这种键盘状态,但是我要离开那一天了.彼得.
编辑 请注意,我不希望防止在配置改变而重新创建活动.
我还试验了WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED在手机上旋转时保持键盘打开/关闭状态(单窗格布局)但是a)不适用于双窗格布局b)在将应用程序带到前台时没有保持键盘状态.
基本上我想在清单中设置我的活动的主题如下:
android:theme="@android:style/Theme.Translucent.NoTitleBar"
Run Code Online (Sandbox Code Playgroud)
我希望我的活动加载一个主题为Theme.Holo.Dialog的ListFragment(以我自己的风格定义),但我不能只在我的片段中调用setStyle(....),如果它是一个DialogFragment.
我相信我应该能够使用ContextThemeWrapper,但是我无法理解我需要进行的调用.到目前为止,在我的onCreateView中,我有:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
LayoutInflater newInflater = inflater.cloneInContext(new ContextThemeWrapper(getActivity(), R.style.DialogThemeSelector));
View inflatedView = newInflater.inflate(R.layout.favourites_print, container, false);
.....
Run Code Online (Sandbox Code Playgroud)
但这不起作用.提前致谢.彼得.
*编辑*发布方式:
<style name="DialogThemeSelector" parent="@android:style/Theme.Holo.Dialog"/>
Run Code Online (Sandbox Code Playgroud) 使用compat lib v1(因为某些错误而不使用v2 | 3); 这个问题的一个变种.
我有一个片段,其UI具有各种控件,我希望在方向更改时保持其状态.
父方活动在方向改变时被销毁(请不要告诉我有关清单变化以避免活动娱乐!!!!).
片段调用setRetainInstance(true).
1)现在我的理解是,具有唯一ID的视图应该保留一些状态,例如方向更改.鉴于此,我期望一个非null的bundle,onCreateView|onActivityCreated但它是null.
2)在任何情况下如果我保存状态onSaveInstanceState(确保我调用super)我仍然在'onCreateView | onActivityCreated'中得到一个空包
3)如果我不调用setRetainInstance(true)那么onCreateView|onActivityCreated即使我没有`onSaveInstanceState'方法,我也会得到一个非空包.
我的问题是,这是否按预期工作,我对生命周期的理解被打破了?无论如何,我猜测对我来说最好的方法是保留片段,然后在片段中保持控件的状态.
提前致谢.彼得.
我正在从服务启动活动,并希望它出现在最近的应用列表中.
但是,如果我退出应用程序,我希望从最近的应用程序列表中删除活动(例如,按活动的UI上的按钮调用finish()).
从最近的应用列表中排除活动android:excludeFromRecents="true"并未向我提供我需要的初始活动行为,即最近的应用列表中显示的活动.
这可能吗?
android ×10