我的场景:活动1由碎片A-> B-> C组成.使用以下代码添加所有碎片:
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.content, fragment, TAG);
ft.addToBackStack(TAG);
ft.commit();
Run Code Online (Sandbox Code Playgroud)
现在,从片段C开始,我想直接返回片段A.因此,我ft.addToBackStack(TAG)在添加片段C时进行了评论.因此,当我从CI按下后退按钮时,直接在屏幕上显示片段A.
但是,片段C不会被A替换.事实上,这两个片段都是可见的.我该如何解决这个问题?
我对这些功能和它们的目的非常困惑.我观察到,使用新的replace()替换现有的片段.我们可以使用addToBackStack(null)将该片段放在后面的堆栈中,这样我们就可以回到之前显示的片段了.现在当一个片段被添加(或替换) - onAttach()- > onCreate()etc ....片段的方法按顺序调用.
现在,当我们remove()从我们的活动中调用片段时,片段的哪些函数被调用以及按什么顺序?
做什么attach()和detach()做什么?是否detach()删除片段?并且这两个时attach()和detach()使用时,该片段的功能调用,并且在该阶ΣΔ
还有什么呢popBackStack()?我的意思是当我们popBackStack()从我们的活动中使用片段时调用哪些函数?
什么时候onDestroy()调用?
谢谢.
Activity_1比方说,我经历了很多步骤
Activity_2 > Activity_3 ....在某些Activity_n我更改了一些相关的数据Activity_1并使用它来调用它
Intent intent = new Intent(Activity_n.this, Activity_1.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
刷新内容.但是后来我可以一直回到Activity_1我开始的地方,那里有旧数据.
相反,我希望使用上面的代码调用初始的Activity_1's onResume().或适当的旗帜
FLAG_ACTIVITY_CLEAR_TOP
考虑由活动组成的任务:A,B,C,D.如果D调用具有解析为活动B的组件的Intent的startActivity(),则C和D将完成,B接收给定的Intent,从而导致现在堆栈是:A,B.
那是'博士说的,但不是我得到的.
我目前正在构建一个Android应用程序(14 <= SDK <= 21),使用一个ActionBarActivity或多个Fragments,例如ListFragment和MapFragment,它们在一个FrameLayout视图中交换.
ActionBarActivity自动替换/提交片段A.然后,当用户点击一个按钮时,托管活动替换/提交一个新的不同片段B.我的目标是让用户在按下后退按钮时返回片段A .
现在有些代码了.
主要活动
public class MainActivity extends ActionBarActivity implements StopFragment.OnFragmentInteractionListener,
StopItemFragment.OnFragmentInteractionListener {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fragmentManager = getFragmentManager();
fragmentManager.enableDebugLogging(true);
...
if (fragmentManager.findFragmentById(R.id.content_frame) == null) {
StopItemFragment list = StopItemFragment.newInstance(null); //A - extends ListFragment
fragmentManager.beginTransaction()
.replace(R.id.content_frame, list)
.addToBackStack(null)
.commit();
}
...
@Override
public void onFragmentInteraction(String id) {
selectItem(Integer.parseInt(id));
}
private void selectItem(int position) {
StopFragment fragment = StopFragment.newInstance(null, null); …Run Code Online (Sandbox Code Playgroud) 我有两个活动; 假设A和B activity A是有广播接收器注册侦听将完成活动A.我注册的广播接收器的特定事件 onCreate(),并摧毁它onDestroy()的activity A.
为简单起见,有一个button在activity B名为"破坏活性的A".当用户点击时button,activity A应该销毁.
通常所有这些都运行顺利,没有任何问题,但问题出现在以下场景中:
1)假设我在activity B,我按Home键将应用程序移动到后台然后如果我使用其他资源繁重的应用程序,Android系统将杀死我的应用程序以释放内存.然后,如果我最近的任务打开我的应用程序时,activity B将被收回,这是onCreate(),onResume()等方法将被调用.现在我按button摧毁activity A,但活动A已经被破坏,所以activity A的onCreate(),onResume()等方法将不会被调用之前,除非我去activity A按back button.因此broadcast receiver没有注册来监听事件.
2)当用户在设备的设置中从Developer选项中选择"Do not keep activities"时,会出现同样的问题.
我一直在寻找解决这个问题很长一段时间,但我无法找到合适的答案.处理这种情况的最佳方法是什么?这是Android的错误吗?这个问题应该有一些解决方案.
请帮我.
android broadcastreceiver android-lifecycle android-activity back-stack
我不希望我的应用程序在按下按钮时显示很少Activity(说SplashScreenActivity)back.所以我noHistory=true在我的Manifest.xml用途中使用Activity如下所示:
<activity
android:name="com.gokul.SplashScreenActivity"
android:noHistory="true" >
</activity>
Run Code Online (Sandbox Code Playgroud)
noHistory我也可以finish()用我的SplashActivity.onPause()方法或任何我想要的方式调用,而不是设置,如下所示:
@Override
protected void onPause() {
super.onPause();
finish();
}
Run Code Online (Sandbox Code Playgroud)
两者都能完美地完成工作.但哪一个更好用,使用noHistory或打电话finish()?
这是一个Fragment包含a 的基本代码WebView.
WebFragment.java
public class WebFragment extends Fragment {
String TAG = "WebFragment";
private WebView webView;
private String currentUrl = "http://www.google.com";
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.webview_layout, null);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
webView = (WebView) getView().findViewById(R.id.helloWebview);
initWebView();
webView.loadUrl(currentUrl);
}
@SuppressLint("SetJavaScriptEnabled")
private void initWebView() {
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new JavaScriptInterface(), "HTMLOUT");
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
Log.e(TAG, "Loding...");
super.onPageStarted(view, url, favicon); …Run Code Online (Sandbox Code Playgroud) android android-webview android-fragments android-viewpager back-stack
我有一个活动的应用程序返回堆栈A - > B - > C - > D - > E.现在在活动E,我想知道我导航的后台堆栈活动.我怎么找到这个?
我遇到一个奇怪的问题,同时使用Fragments并弹出它们.
我有一个片段活动:
Step1:我在起始命名片段A中的那个Activity的onCreate中附加了一个片段:
这是片段活动的onCreate
@Override
protected void onCreate(Bundle savedBundleState) {
super.onCreate(savedBundleState);
setContentView(R.layout.activity_base_new);
Fragement_Home home = new Fragement_Home();
FragmentManager manager = getSupportFragmentManager();
manager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit();
}
Run Code Online (Sandbox Code Playgroud)
步骤:2之后,我附上了以下代码替换了Fragment:
Fragment_More moreFragment = new Fragment_More();
FragmentManager manager = getSupportFragmentManager();
manager.beginTransaction().replace(R.id.frameContent, moreFragment).addToBackStack("more").commit();
Run Code Online (Sandbox Code Playgroud)
第3步:在那之后我再次以相同的方式在Fragment_More上添加了一个片段:
Fragment_AboutRockstand termsConditions = new Fragment_AboutRockstand();
getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.frameContent, termsConditions).addToBackStack("about_rockstand").commit();
Run Code Online (Sandbox Code Playgroud)
这是我的片段活动onBackPressedButton Lisetener:
@Override
public void onBackPressed() {
FragmentManager fm = getSupportFragmentManager();
Fragment f = fm.findFragmentById(R.id.frameContent);
if(fm.getBackStackEntryCount() > 1){
fm.popBackStack();
} else{
finish();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的问题:
当我从第3步按回来时,它按照onBackPressed的描述成功地给了我之前的片段,它会回弹并将我带到前面的片段.但是从Fragment_More开始,当我再次按下时,它会显示空白的FRAGMENT内容.它从未显示我在活动的OnCreate中的第1步中添加的First Fragment.
请评论.我做错了什么?
谢谢
我的导航抽屉中列出了许多页面/片段,用户可能经常在这些页面/片段之间切换,我希望它们在后台中,以便他们可以导航回来,但我只想在后台堆栈中每个片段的一个实例用户不必按下疯狂的次数退出应用程序.我无法弄清楚如何在没有删除页面的情况下有效地"重新排序"后台堆栈.
目前,当我更改页面时,我正在使用此代码更改片段并确保它仅在后面的堆栈中一次
if (mFragMgr == null) {
mFragMgr = getSupportFragmentManager();
}
String backStateName = fragmentDescriptor.name();
boolean fragmentPopped = mFragMgr.popBackStackImmediate(backStateName, 0);
if (!fragmentPopped){
mFragMgr.beginTransaction()
.remove((Fragment) mFragment)
.replace(R.id.content_frame, (Fragment) mFragment)
.addToBackStack(backStateName)
.commit();
}
Run Code Online (Sandbox Code Playgroud)
我在onBackPressed中使用此代码
@Override
public void onBackPressed() {
if (mFragMgr.getBackStackEntryCount() > 0) {
mFragMgr.popBackStackImmediate();
} else {
super.onBackPressed();
}
}
Run Code Online (Sandbox Code Playgroud)
这有效,但这意味着它删除了我不想删除的页面.例:
当我的用户在订单中访问6页A > B > C > D > E > C因为我正在进行删除时,我期望以下堆栈:
[E] [C]
[D] [D] [E]
[C] [C] [C] [D]
[B] [B] [B] [B] [B]
[A] -> [A] …Run Code Online (Sandbox Code Playgroud)