如何从 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(),所以这个解决方案对我不起作用。

来自How do I start an activity from within a Fragment?:

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 关联的布局?

提前致谢!

【问题讨论】:

FInalClassactivity 的布局中是否有视图? 只是一个旁注,不确定从片段中执行“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 支持)

Android如何成功截击请求,如何将数据从Activity传递到Fragment?

使用 Activity 启动 Fragment 会更好吗?