我想从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)的视图
答案 0 :(得分:2)
如果我理解你的问题,你想在另一个Activity的Activity中启动一个片段。 这就是我要做的事情。
从当前的Activity中,我将启动Click on
上的其他ActivityIntent intent = new Intent (ActivityA.this, ActivityB.class);
intent.putExtra("EXTRA", "openFragment");
startActivity(intent);
在目标活动中,侦听意图附加内容并开始操作。
switch (getIntent().getStringExtra("EXTRA")){
case "openFragment":
getSupportFragmentManager().beginTransaction().replace(R.id.replacableLayout, new FragmentActivityB()).commit();
getSupportActionBar().setTitle("Fragment Activity B");
break;
}
对我有用......
答案 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