Android 动态设置父活动
因此,目前我有一个可以从两个不同活动访问的活动,问题是我只能将一个活动设置为清单XML文件中的父活动。显然,这是糟糕的UX/UI设计,因为该活动可能会将用户发送回他们以前所在的错误活动,因此我尝试动态设置哪个活动是父活动Android 动态设置父活动,android,Android,因此,目前我有一个可以从两个不同活动访问的活动,问题是我只能将一个活动设置为清单XML文件中的父活动。显然,这是糟糕的UX/UI设计,因为该活动可能会将用户发送回他们以前所在的错误活动,因此我尝试动态设置哪个活动是父活动 问题是,我不太确定如何处理这个问题,无论是在代码还是XML中,因此任何指针都是值得赞赏的 这里有两个概念“向上”和“向后”“回来”是最明显的一个:带我去我来这里之前的地方。通常你不需要担心“返回”,因为系统会处理得很好从元素到集合,从细节到更广阔的画面,“向上”并不是那么明显—
问题是,我不太确定如何处理这个问题,无论是在代码还是XML中,因此任何指针都是值得赞赏的 这里有两个概念“向上”和“向后”“回来”是最明显的一个:带我去我来这里之前的地方。通常你不需要担心“返回”,因为系统会处理得很好从元素到集合,从细节到更广阔的画面,“向上”并不是那么明显——它类似于缩小 以下哪一项适合您的用例
根据下面的评论:向上按钮从android清单中提取目的地,但它可以是。要了解如何正确使用向上导航,请参阅
注意,上面的Android开发指南中有一个很大的缺陷,因为NavUtils函数在ICSand lower和jellybeand higher中的工作方式不同。NavUtils中的此缺陷得到了很好的解释就像这样,您可以动态导航到父活动:
getActionBar().setDisplayHomeAsUpEnabled(true);
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Respond to the action bar's Up/Home button
case android.R.id.home:
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
注意:它会将您重定向到您来自的活动或片段,无论它是否为父级。单击操作栏上的“向上/主页”按钮即可完成当前活动 要重写的方法是getParentActivityIntent 这是我的代码,工作非常好
@Override
public Intent getParentActivityIntent() {
Intent parentIntent= getIntent();
String className = parentIntent.getStringExtra("ParentClassSource");
Intent newIntent=null;
try {
//you need to define the class with package name
newIntent = new Intent(OnMap.this, Class.forName(className));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return newIntent;
}
来自家长的活动
Intent i = new Intent(DataDetailsItem.this, OnMap.class);
i.putExtra("ParentClassSource", "com.package.example.YourParentActivity");
startActivity(i);
对于未来的读者,这里有一个示例,说明如何实际实施正式/适当的解决方案,当父活动可能不同时,以This开头的一段滚动是合适的 请注意,此解决方案假定您正在使用来实现ActionBar,并且如果您要退出的活动位于不属于您的应用程序的“任务”中,您至少可以在清单XML文件中设置一个“默认”父活动,以供回退。请阅读链接文档以获取说明
// Override BOTH getSupportParentActivityIntent() AND getParentActivityIntent() because
// if your device is running on API 11+ it will call the native
// getParentActivityIntent() method instead of the support version.
// The docs do **NOT** make this part clear and it is important!
@Override
public Intent getSupportParentActivityIntent() {
return getParentActivityIntentImpl();
}
@Override
public Intent getParentActivityIntent() {
return getParentActivityIntentImpl();
}
private Intent getParentActivityIntentImpl() {
Intent i = null;
// Here you need to do some logic to determine from which Activity you came.
// example: you could pass a variable through your Intent extras and check that.
if (parentIsActivityA) {
i = new Intent(this, ActivityA.class);
// set any flags or extras that you need.
// If you are reusing the previous Activity (i.e. bringing it to the top
// without re-creating a new instance) set these flags:
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
// if you are re-using the parent Activity you may not need to set any extras
i.putExtra("someExtra", "whateverYouNeed");
} else {
i = new Intent(this, ActivityB.class);
// same comments as above
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
i.putExtra("someExtra", "whateverYouNeed");
}
return i;
}
注意:如果没有在清单XML文件中设置默认父活动,那么还需要实现,因为系统不知道如何为任务生成backbackback。我没有为这一部分提供任何例子
关于完成式解决方案的思考
在我寻找这个问题的解决方案时,我遇到了一些答案,这些答案支持覆盖onOptionsItemSelected并拦截android.R.id.home按钮的策略,这样他们就可以简单地完成当前活动,返回到上一个屏幕
在许多情况下,这将实现所需的行为,但我只想指出,这绝对不是一个正确的向上导航相同。如果您是通过父活动之一导航到子活动,则“是完成”将返回到正确的上一屏幕,但如果您通过通知输入子活动,该怎么办?在这种情况下,点击“向上”按钮完成操作将使您直接返回主屏幕或您在点击通知之前正在查看的任何应用程序,而它本应将您发送到应用程序中的适当父活动。您需要跟踪父活动。实现这一点的一种方法是将其存储为启动子活动的意图中的额外内容。例如,如果活动A启动活动B,则将A的意图存储在为B创建的意图中。然后在处理向上导航的B的OnOptions ItemSelected中,检索A的意图并使用所需的意图标志启动它 下面的文章有一个更复杂的用例,包含一系列子活动。它解释了如何向上导航到父对象的相同或新实例,并在导航过程中完成中间活动
通常,“详细”类型的活动必须提供“向上”导航,如果它有嵌套/相关的内容。“返回”导航由系统处理,因此您真的不必担心它 现在,为了支持“向上”导航,有几种方法: 具有在AndroidManifest中定义的父活动的活动
Your Android Manifest
---------------------
<activity
android:name="com.example.app.DetailActivity"
android:parentActivityName="com.example.app.MainActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.app.MainActivity" />
</activity>
Your Detail Activity
--------------------
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
在这个解决方案中,如果用户按下“back”,片段将从片段backbackback弹出,用户将被带回到前一个片段,同时仍然保持在相同的活动中。如果用户按下“向上”键,则活动将被取消,用户将被引导回作为父活动的上一个活动。这里的关键是将片段用作UI,将活动用作片段的宿主
希望这有帮助。您可以覆盖“向上”按钮,使其与“后退”按钮类似,如下所示:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
科特林2020
我的活动从不同的地方展开
ent活动,因此AndroidManifest仅适用于1个父活动
您可以像这样返回到上一个活动:
supportActionBar?.setDisplayHomeAsUpEnabled(true)
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
when(item!!.itemId){
android.R.id.home -> {
finish()
return true
}
}
return super.onOptionsItemSelected(item)
}
父活动用于向上导航,例如操作栏中的向上箭头。反向导航不使用父活动,而是使用反向堆栈。在您的情况下,使用startActivityForResult和finish管理后堆栈应该没问题。我想利用操作栏中的向上箭头,因此,我想我真正想要的是一种动态设置触碰导航时应该参考的活动的方法。另一个相关的问题——也没有真正的答案:我对处理背部行为更感兴趣,但根据您的描述,系统应该自动处理这个问题?那么操作栏中的向上按钮呢,它是从XML父集合中提取目的地,还是仅仅链接回它来自的上一个活动?是的,向上按钮从android清单中提取目的地,但它可以。如果你对你的应用很认真,另外,请阅读这篇文章-保持流量将真正帮助应用程序感觉自然。不要说你需要把所有的事情都记在心里,只要知道事情是有办法完成的。为什么这个答案投了-2票而没有评论?海报应添加示例而不是链接,但链接指向正确的手册页面+1这个答案应该包含一个很好的例子,而不仅仅是将来可能会消亡的链接。但我给这个a+1是为了让分数回到正确的位置,因为它确实让我找到了一个真正正确的解决方案,这与其他给出的答案不同。这并不完全是家长活动,但效果很好。对于那些阅读者来说,虽然finish在很多情况下都能达到预期的行为,在某些情况下,它并不总是导致正确的向上导航。请看我的答案和想法。回归真实是一个非常重要的方面。我完成了,但没有返回。现在工作。谢谢,最后一道菜和最后一道菜的区别是什么。navigateUpFromSameTask@nuttynibbles完成关闭当前活动。这不是使用向上导航的正确方式。感谢您提供了一个如何实现这一点的示例-Android指南中确实缺少了这个示例。getSupportParentActivityIntent在API 15设备中没有为我启动。。。有什么想法吗?@worked根据getSupportParentActivityIntent应该只在运行
supportActionBar?.setDisplayHomeAsUpEnabled(true)
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
when(item!!.itemId){
android.R.id.home -> {
finish()
return true
}
}
return super.onOptionsItemSelected(item)
}