无法在父 Activity 中调用 Fragment 方法
Posted
技术标签:
【中文标题】无法在父 Activity 中调用 Fragment 方法【英文标题】:Can't call Fragment method in parent Activity 【发布时间】:2021-03-13 16:48:50 【问题描述】:我只是想从我的 MainActivity(parent) 中的一个片段中调用一个方法。 但是一旦我尝试调用该方法,我就会得到 NullPointerException。
尝试调用虚方法'void com.example.fragmenttest.TestFragment.testMethod()' 在空对象上 参考
这是我在 MainActivity 的 onCreate 中所做的:
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.containerView, new TestFragment()).commit();
TestFragment fragment = (TestFragment) fragmentManager.findFragmentById(R.id.testfragment);
fragment.testMethod();
这是片段:
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
View rootView=inflater.inflate(R.layout.activity_fragment,container,false);
return rootView;
public void testMethod()
Toast.makeText(getContext(), "Test", Toast.LENGTH_LONG).show();
activity_main.xml:
<?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:layout_
android:layout_
tools:context=".MainActivity">
<FrameLayout
android:orientation="vertical"
android:layout_
android:layout_
android:id="@+id/containerView">
</FrameLayout>
</RelativeLayout>
和activity_fragment.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
tools:context="com.example.fragmenttest.MainActivity"
android:id="@+id/testfragment">
<TextView
android:layout_
android:layout_
android:layout_centerInParent="true"
android:textSize="50dp"
android:text="Fragment" />
</RelativeLayout>
当然,这不是我真正的项目,我只是创建了一个新项目来简化我的问题。 在我的实际项目中,我想在调用 onRewardedVideoCompleted 方法后立即从我的片段中调用一个方法,该方法位于我的 MainActivity 中。
如何从我的片段中调用方法而不会出现空指针异常并且不使用接口? (对这个小问题使用接口似乎没有必要)
谢谢
【问题讨论】:
【参考方案1】:commit()
是异步的。这就是您的项目在启动时崩溃的原因。不要使用commit()
,而是使用commitNow()
。另外,不要使用new TestFragment()
,而是创建一个变量,以便您可以调用它的方法。
TestFragment testFragment= new TestFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.containerView, testFragment).commitNow();
testFragment.testMethod();
【讨论】:
【参考方案2】:片段事务是异步的(除非您使用 executePendingTransactions())。您的交易可能尚未完成。您在 FragmentTransaction(在支持库中)上使用 runOnCommit 在完成后执行代码。
【讨论】:
【参考方案3】:FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
TestFragment yourFragment = newe TestFragment();
fragmentTransaction.replace(R.id.containerView, yourFragment).commit();
yourFragment.testMethod();
首先,你必须将yourFragment
传递给fragmentTransaction
,然后你可以调用任何你想要的方法。
【讨论】:
这是不正确的。 Toast 消息将无法获取上下文,因此会崩溃。 您可以通过getContext()
方法将上下文获取到片段中。
commit() 是异步的。如果片段管理器没有完成,getContext() 将不会返回上下文。
所以为fragment编写contractor
方法,并将Activitycontext
传递给fragment并使用它。
通过contractor
兄弟,将contractor
方法写入片段中,例如``` private Context context;公共 OrderFragment(上下文上下文) this.context = context; ```以上是关于无法在父 Activity 中调用 Fragment 方法的主要内容,如果未能解决你的问题,请参考以下文章
在父Activity onBackPressed方法中调用Fragment接口方法
gitee查询用户名和密码 Android Studio 3.5以上版本新特性 sharePreferences 使用 不同的Activity间的preferences共享问题 Fragmen
当我在父 Activity 中按下 onBackpressed 时,如何控制 Fragment 中的 VideoView?