【问题标题】:How can I start an Activity from a Fragment?如何从 Fragment 启动 Activity?
【发布时间】: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 上没有显示任何错误。我在网上搜索了类似的行为,但发现了一些无法解决我的问题的解决方案:

我的项目中没有任何方法addToBackStack(),所以这个解决方案对我不起作用。

getActivity().startActivity(myIntent) 是公认的答案。

他们用于从 Fragment 启动 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 您的活动实现了您的界面,因此通过在您的界面上调用一个方法,您实际上是在调用您的活动中的一个方法,这将反过来启动另一个活动。因此从活动开始活动。我认为这样更干净,活动更改处于顶层,更易于维护代码。此外,片段实际上是活动的子项并存在于活动中,因此通过从片段开始一个活动,它就像一个孩子订购父母:)

标签: android android-layout android-fragments android-intent android-activity


【解决方案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);
      

      【讨论】:

      • 这没有任何变化。我得到了解决方案。不管怎样,谢谢! :)
      • 再次使用它也会完美运行我正在使用它
      猜你喜欢
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-20
      • 2012-02-03
      • 1970-01-01
      相关资源
      最近更新 更多