【问题标题】:How to start a fragment from another activity如何从另一个活动开始一个片段
【发布时间】:2017-08-16 05:36:13
【问题描述】:

我想从 B 活动开始一个片段,但该片段在主要活动中。如果我使用 FragmentTransaction,但它会给出错误“No view found for ID for fragment”

代码

FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.layoutContent, frag);
ft.commit();

错误

未找到片段 PlaylistFrag{5764566 #0 id=0x7f0e00be} 的 id 0x7f0e00be (com.company.app:id/layoutContent) 的视图

【问题讨论】:

  • 使用接口或本地广播并在其回调中替换片段
  • Id 0x7f0e00be 是 layoutContent
  • 由于您没有将 FrameContainer id 设置为 layoutContent,因此出现错误
  • 我将它用作菜单项。但我的一项活动不在导航项目中。因此,当我从该活动切换到片段时,它会出错。

标签: android android-fragments


【解决方案1】:

如果我理解您的问题,您想从另一个 Activity 开始一个 Activity 中的片段。 这就是我要解决的问题。

  1. 从当前的 Activity,我会在点击时启动另一个 Activity

    Intent intent = new Intent (ActivityA.this, ActivityB.class);
    intent.putExtra("EXTRA", "openFragment");
    startActivity(intent);
    
  2. 在目标 Activity 中,侦听 Intent Extras 并开始操作。

    switch (getIntent().getStringExtra("EXTRA")){ 
        case "openFragment":
            getSupportFragmentManager().beginTransaction().replace(R.id.replacableLayout, new FragmentActivityB()).commit();
            getSupportActionBar().setTitle("Fragment Activity B");
            break;
    }
    

它对我有用...

【讨论】:

  • 但是,R.id.replacableLayout 只是 ActivityA 不在 ActivityB 中
【解决方案2】:

这将引发异常,因为getSupportFragmentManager() 是您在其上工作的 Activity 的函数,因此当您使用 ft.replace(R.id.layoutContent, frag); 时将在当前 Activity 上查找 layoutContent 并且不会找到

我不是你想要的

解决方案 ==> - 使用 Event Bus 或 Rxjava :) 或者可以使用带有 setter 和 getter 的 n 接口并在另一个活动中检查它或使用静态变量来检查您想要替换的片段:)

【讨论】:

    【解决方案3】:

    在您的 onClick 中添加此代码

    // Create new fragment and transaction
    Fragment newFragment = new ExampleFragment();
    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    
    // Replace whatever is in the fragment_container view with this fragment,
    // and add the transaction to the back stack
    transaction.replace(R.id.fragment_container, newFragment);
    transaction.addToBackStack(null);
    
    // Commit the transaction
    transaction.commit();
    

    并添加 onBackPressed()

    @Override
    public void onBackPressed() {
        if (getFragmentManager().getBackStackEntryCount() > 0) {
            getFragmentManager().popBackStack();
        } else {
            super.onBackPressed();
        }
    }
    

    【讨论】:

    【解决方案4】:

    在 MainActivity.java 及其布局中制作如下布局

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_add_workout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.nujster.activity.AddWorkoutActivity">
    
        <LinearLayout
            android:id="@+id/add_workout_fragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal"/>
    
    </RelativeLayout>
    

    然后,在主要活动中编写下面的代码来调用片段

    public class AddWorkoutActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_add_workout);
    
                getSupportFragmentManager().beginTransaction().add(R.id.add_workout_fragment, new LevelFragment(), "levels").addToBackStack(null).commit();
        }
    
        @Override
        public void onBackPressed() {
            if (getSupportFragmentManager().findFragmentByTag("levels") != null) {
                LevelFragment levelFragment = (LevelFragment) getSupportFragmentManager().findFragmentByTag("levels");
                if (levelFragment.isVisible()){
                   finish();
                } else{
                    getSupportFragmentManager().popBackStack();
                }
            }
        }
    }
    

    【讨论】:

    • @Ganesh Sumb 你的具体问题是什么我没明白,请详细说明。
    【解决方案5】:

    您可以在不同的活动中加载相同的片段。

    通常在 Activity 容器中加载 Fragment。

    Activity-1 布局有一个容器说 R.id.layoutContent Activity-2 布局也应该有一个容器 R.id.xxx

    ft.replace(R.id.layoutContent[Container where fragment loads], frag);
    

    可能是Activity-2没有容器的id

    【讨论】:

    • Activity 2 没有容器 ID。它不是“也许”它没有
    猜你喜欢
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多