我正在实现一个数据库,因为我需要准备列表或每次进行一些更改时更新它。我在mainActivity之上有一个片段,我无法在MainActivity
内执行操作,因此有些操作要在MainActivity
中完成,而其他操作则在fragment class
中完成。
因此,在片段类中,扩展片段有一个名为preparelist()
的方法,它更新数据库并填充数据。
在我的mainactivity中,我正在使用默认的overflow
菜单项执行删除操作,但在这里我需要调用preparelist()
方法以显示已执行的操作或必须关闭应用程序为了显示已执行的操作
我已经尝试了网上的以下代码
MyFragment fragment= (MyFragment)getSupportFragmentManager().findFragmentById(R.id.frag);
( (MyFragment)fragment).prepareList();
但这显示错误
java.lang.NullPointerException: Attempt to invoke virtual method...on a null object reference
基本上我想知道的是如何在
preparelist()
内调用MainActivity
方法而不进行任何其他抽象类或类似
答案 0 :(得分:1)
从Fragment
:
Activity
的公开方法
MyFragment fragment= (MyFragment)getSupportFragmentManager().findFragmentById(R.id.frag);
if(fragment != null)
( (MyFragment)fragment).prepareList();
else
Toast.makeText(this, "fragment is null", Toast.LENGTH_SHORT).show();
将删除功能移动到您的片段:
写道:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setHasOptionsMenu(true); //this fragment can now override
//options menu
}
现在执行与您在活动中相同的操作,覆盖onCreateOptionsMenu()
,onOptionsItemSelected
等。请注意,方法签名与Activity
&#39的签名不同; S。请参阅Fragment文档。
答案 1 :(得分:0)
相反,要按ID查找片段,请通过TAG查找,因此需要进行两次更改。见下面的代码
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.id_of_frame_layout_in_xml, myFragment ,"ADD_A_TAG_NAME_HERE");
fragmentTransaction.commit();
将ADD_A_TAG_NAME_HERE替换为TAG名称,id_of_frame_layout_in_xml将是xml中的framelayout,您将在其中添加/替换您的片段
现在您可以通过TAG找到片段
MyFragment fragment= (MyFragment)getSupportFragmentManager().findFragmentByTAG("ADD_A_TAG_NAME_HERE");
创建 TAG 的一个好方法如下
public class MyFragment extends Fragment {
public static final String TAG = MyFragment.class.getSimpleName();
...
}
所以你的陈述将是:
getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.id_of_frame_layout_in_xml, myFragment, MyFragment.TAG);
和
MyFragment fragment= (MyFragment)getSupportFragmentManager().findFragmentByTAG(MyFragment.TAG);