无法调用父级中的 Fragment 方法 Activity
Can't call Fragment method in parent Activity
我只是想从我的 MainActivity(parent) 中的一个片段调用一个方法。
但是,一旦我尝试调用该方法,我就会收到 NullPointerException。
Attempt to invoke virtual method 'void
com.example.fragmenttest.TestFragment.testMethod()' on a null object
reference
这是我在 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_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<FrameLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
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_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.fragmenttest.MainActivity"
android:id="@+id/testfragment">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textSize="50dp"
android:text="Fragment" />
</RelativeLayout>
当然这不是我真正的项目,我只是创建了一个新项目来简化我的问题。
在我的真实项目中,我想在调用 onRewardedVideoCompleted 方法后立即从我的片段中调用一个方法,该方法位于我的 MainActivity 中。
如何在不出现空指针异常且不使用接口的情况下从我的片段中调用方法? (这个小问题用接口好像没必要)
谢谢
片段交易是异步的(除非您使用 executePendingTransactions())。您的交易可能尚未完成。您在 FragmentTransaction(在支持库中)上使用 runOnCommit 在完成后执行代码。
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();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
TestFragment yourFragment = newe TestFragment();
fragmentTransaction.replace(R.id.containerView, yourFragment).commit();
yourFragment.testMethod();
首先,您必须将yourFragment
传递给fragmentTransaction
,然后您可以调用任何您想要的方法。
我只是想从我的 MainActivity(parent) 中的一个片段调用一个方法。 但是,一旦我尝试调用该方法,我就会收到 NullPointerException。
Attempt to invoke virtual method 'void com.example.fragmenttest.TestFragment.testMethod()' on a null object reference
这是我在 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_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<FrameLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
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_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.fragmenttest.MainActivity"
android:id="@+id/testfragment">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textSize="50dp"
android:text="Fragment" />
</RelativeLayout>
当然这不是我真正的项目,我只是创建了一个新项目来简化我的问题。 在我的真实项目中,我想在调用 onRewardedVideoCompleted 方法后立即从我的片段中调用一个方法,该方法位于我的 MainActivity 中。
如何在不出现空指针异常且不使用接口的情况下从我的片段中调用方法? (这个小问题用接口好像没必要)
谢谢
片段交易是异步的(除非您使用 executePendingTransactions())。您的交易可能尚未完成。您在 FragmentTransaction(在支持库中)上使用 runOnCommit 在完成后执行代码。
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();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
TestFragment yourFragment = newe TestFragment();
fragmentTransaction.replace(R.id.containerView, yourFragment).commit();
yourFragment.testMethod();
首先,您必须将yourFragment
传递给fragmentTransaction
,然后您可以调用任何您想要的方法。