我只想从mainactivity(父级)中的片段调用一个方法。但是当我尝试调用这个方法时,我得到了一个nullpointerexception。
尝试对空对象引用调用虚拟方法“void com.example.fragmenttest.testfragment.testmethod()”
以下是我在创建main活动时所做的:
@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();
}
活动\u 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\ u 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>
当然这不是我真正的项目,我只是创建了一个新项目来简化我的问题。在我的实际项目中,我想在调用onRewarddVideoCompleted方法后立即从片段中调用一个方法,该方法在我的mainactivity中。
如何从片段中调用方法而不获取空指针异常和不使用接口(为这个小问题使用接口似乎是不必要的)
谢谢
3条答案
按热度按时间yhived7q1#
commit()
是异步的。这就是为什么你的项目在启动时就崩溃了。而不是使用commit()
,使用commitNow()
. 还有,不用new TestFragment()
,创建一个变量,以便可以调用其方法。4nkexdtk2#
片段事务是异步的(除非使用executependingtransactions())。您的交易可能尚未完成。在fragmenttransaction上使用runoncommit(在支持库中)在完成后执行代码。
dced5bon3#
首先,你必须通过
yourFragment
至fragmentTransaction
,则可以调用所需的任何方法。