如何从 Fragment 启动 Activity?
Posted
技术标签:
【中文标题】如何从 Fragment 启动 Activity?【英文标题】:How can I start an Activity from a Fragment? 【发布时间】:2016-12-19 07:04:06 【问题描述】:当我按下最后一个按钮时,我想从Fragment
开始一个Activity
,但我得到的是空白布局,而不是与Activity
关联的布局。
我像这样从MainActivity.class
调用Fragment
:
FragmentManager mFragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.mainContent,new FragmentMain()).commit();
在FragmentMain
类上,我有一个onClick
方法,如下所示:
@Override
public void onClick(View v)
Intent intent = new Intent(getActivity(), FinalClass.class);
getActivity().startActivity(intent);
但结果是空白布局,logcat 上没有显示任何错误。我在网上搜索了类似的行为,但发现了一些无法解决我的问题的解决方案:
来自In Fragment on back button pressed Activity is blank:我的项目中没有任何方法addToBackStack()
,所以这个解决方案对我不起作用。
getActivity().startActivity(myIntent)
是公认的答案。
他们用于从 Fragment 启动 Activity 的方式与我使用的方式没有改变。
来自Starting Activity by intent from Fragment starts blank Activity:提供的任何解决方案都对我有用。
P.S:我已经在Manifest.xml
文件中声明了Activity
:
<activity
android:name=".FinalClass"
android:screenOrientation="portrait"
android:label="Final Class"
android:icon="@mipmap/ic_launcher"
android:theme="@style/AppTheme.NoActionBar" />
P.S.2:不要怀疑是否需要更多代码(我试图简化它以专注于问题)。
我能做些什么来避免Activity
给我一个空白布局而不是与Activity
关联的布局?
提前致谢!
【问题讨论】:
FInalClass
activity 的布局中是否有视图?
只是一个旁注,不确定从片段中执行“getActivity().startActivity()”是否是一个好习惯。我建议使用您的活动将实现的接口,然后从您的片段中调用接口上的方法。然后从你的活动开始你的活动。不要认为这与您的问题有关..
@BurhanuddinRashid 我有以下内容:public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) final View inflaterFinalClass = inflater.inflate(R.layout.activity_final_class, null); return inflaterFinalClass;
FinalClass
is Fragment?..show layout code for activity_final_class
@Error404 您的活动实现了您的界面,因此通过在您的界面上调用一个方法,您实际上是在调用您的活动中的一个方法,这将反过来启动另一个活动。因此从活动开始活动。我认为这样更干净,活动更改处于顶层,更易于维护代码。此外,片段实际上是活动的子项并存在于活动中,因此通过从片段开始一个活动,它就像一个孩子订购父母:)
【参考方案1】:
在onCreate
中像这样在活动中设置布局
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_final_class);
不要使用onCreateView
进行活动
【讨论】:
【参考方案2】:您不能使用片段实例从 Fragment 启动 Activity。但您可以使用 片段容器 Activity 实例启动 Activity。 例如:假设 Activity A 具有 Fragment Abc,因此您必须使用 Activity A 的实例而不是 Fragment abc。
这样做不会在您之前的片段中没有效果,因为它位于您的活动顶部,而不是替换或添加现有片段。如果您想对现有的 Fragment 进行一些更改,则必须覆盖 onActivityResult
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
super.onActivityResult(requestCode, resultCode, data);
:)GlbMP
【讨论】:
【参考方案3】:最后,我找到了解决方案。我使用了错误的 onCreate 方法。
以前,我有:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
final View inflaterFinalClass = inflater.inflate(R.layout.activity_final_class, null);
return inflaterFinalClass;
但我应该使用:
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_final_class);
因此,总而言之,我对 Fragment 使用 onCreate 方法,而不是对 Activity 使用 onCreate 方法。
【讨论】:
这就是我的回答 @BurhanuddinRashid 哦,对不起。我正在写它,但没有看到你的答案,但当我意识到这可能是我创建 Activity 的方式上的问题时,你的评论指出我要找到解决方案。 @BurhanuddinRashid 是的,我仍然无法接受。现在我做到了。无论如何,我会保持我的答案。也许它也可以帮助更多的人。【参考方案4】:您可以使用 onCreateView 方法,然后使用此代码,它也会有所帮助...
Intent intent = new Intent(getActivity(), FinalClass.class);
getActivity().startActivity(intent);
// Closing all the Activities
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// Add new Flag to start new Activity
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
【讨论】:
这没有任何变化。我得到了解决方案。不管怎样,谢谢! :) 再次使用它也会完美运行我正在使用它以上是关于如何从 Fragment 启动 Activity?的主要内容,如果未能解决你的问题,请参考以下文章
[Android Studio]如何从Fragment中嵌套的Recycleview启动一个Activity?
Intent 不会从 Fragment 启动 Activity
如何从 Back Press 的 Activity 中返回 Fragment
使用 Transition 从 Fragment 启动 Activity(API 21 支持)