Android 动态设置父活动
因此,目前我有一个可以从两个不同活动访问的活动,问题是我只能将一个活动设置为清单XML文件中的父活动。显然,这是糟糕的UX/UI设计,因为该活动可能会将用户发送回他们以前所在的错误活动,因此我尝试动态设置哪个活动是父活动Android 动态设置父活动,android,Android,因此,目前我有一个可以从两个不同活动访问的活动,问题是我只能将一个活动设置为清单XML文件中的父活动。显然,这是糟糕的UX/UI设计,因为该活动可能会将用户发送回他们以前所在的错误活动,因此我尝试动态设置哪个活动是父活动 问题是,我不太确定如何处理这个问题,无论是在代码还是XML中,因此任何指针都值得赞赏。:) 这里有两个概念“向上”和“向后”“回来”是最明显的一个:带我去我来这里之前的地方。通常你不需要担心“返回”,因为系统会处理得很好从元素到集合,从细节到更广阔的画面,“向上”并不是那么明显
问题是,我不太确定如何处理这个问题,无论是在代码还是XML中,因此任何指针都值得赞赏。:) 这里有两个概念“向上”和“向后”“回来”是最明显的一个:带我去我来这里之前的地方。通常你不需要担心“返回”,因为系统会处理得很好从元素到集合,从细节到更广阔的画面,“向上”并不是那么明显——它类似于缩小 以下哪一项适合您的用例
根据下面的评论:向上按钮从android清单中提取目的地,但它可以是。要了解如何正确使用向上导航,请参阅
注意,上面的Android开发指南中有一个很大的缺陷,因为NavUtils函数对ICS(和更低版本)和JellyBean(和更高版本)的工作方式不同。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);
对于未来的读者,这里有一个示例,说明如何按照(滚动到以“当父活动可能不同时,这是适当的…”开头的段落…)实际实施正式/适当的解决方案 请注意,此解决方案假定您正在使用来实现您的
ActionBar
,并且如果您要退出的活动位于不属于您的应用程序的“任务”中,您至少可以在清单XML文件中设置一个“默认”父活动作为备用(请阅读链接文档以获取说明)
注意:如果没有在清单XML文件中设置默认父活动,那么还需要实现,因为系统不知道如何为任务生成backbackback。我没有为这一部分提供任何例子
关于finish()
类型解决方案的思考
在我寻找这个问题的解决方案时,我遇到了一些答案,这些答案支持覆盖onOptionsItemSelected()
并拦截android.R.id.home
按钮的策略,这样他们就可以简单地finish()
当前的活动
返回上一屏幕
在许多情况下,这将实现所需的行为,但我只想指出,这肯定与正确的向上导航不同。如果您是通过父活动之一导航到子活动,则“是”
finish()
将返回到正确的上一屏幕,但如果您通过通知输入子活动,该怎么办?在这种情况下,finish()。实现这一点的一种方法是将其作为一个额外项存储在您创建的启动子活动的意图中。例如,如果活动A启动活动B,则将A的意图存储在为B创建的意图中。然后在B的onOptionsItemSelected
中处理向上导航的位置,检索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);
}
Kotlin 2020
我的活动从不同的活动启动,因此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)
}
父活动用于向上导航(例如,操作栏中的向上箭头)。反向导航不使用父活动,而是使用反向堆栈。在您的情况下,您可以使用startActivity(ForResult)
和finish
来管理后台堆栈,因此,我想我真正想要的是一种动态设置触碰导航时应该参考的活动的方法。另一个相关的问题——也没有真正的答案:我对处理背部行为更感兴趣,但根据您的描述,系统应该自动处理这个问题?什么abo
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
supportActionBar?.setDisplayHomeAsUpEnabled(true)
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
when(item!!.itemId){
android.R.id.home -> {
finish()
return true
}
}
return super.onOptionsItemSelected(item)
}