如何从另一个活动启动片段

时间:2017-08-16 05:36:13

标签: android android-fragments

我想从B活动开始一个片段,但片段是主要活动。如果我使用FragmentTransaction,但它给出错误“找不到ID为片段的视图”

代码

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)的视图

5 个答案:

答案 0 :(得分:2)

如果我理解你的问题,你想在另一个Activity的Activity中启动一个片段。 这就是我要做的事情。

  1. 从当前的Activity中,我将启动Click on

    上的其他Activity
    Intent intent = new Intent (ActivityA.this, ActivityB.class);
    intent.putExtra("EXTRA", "openFragment");
    startActivity(intent);
    
  2. 在目标活动中,侦听意图附加内容并开始操作。

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

答案 1 :(得分:0)

这将触发一个异常,因为getSupportFragmentManager()是一个函数,其中包含您使用的Activity,因此当您使用ft.replace(R.id.layoutContent, frag);时,将在当前活动中查找layoutContent并且找不到

我不知道你想怎么样

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

答案 2 :(得分:-1)

在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();
    }
}

答案 3 :(得分:-1)

在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();
            }
        }
    }
}

答案 4 :(得分:-1)

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

通常Fragment在Activity容器中加载。

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

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

可能是Activity-2没有容器ID