繁体   English   中英

如何从父Activity访问片段类中的方法?

[英]How to access a method in fragment class from parent Activity?

我正在实现一个数据库,因为我需要准备列表或每次进行一些更改时都对其进行更新。 我在mainActivity的顶部有一个片段,我无法在MainActivity内执行操作,因此一些操作将在MainActivity完成,而其他的操作将在fragment class 因此,在扩展片段的片段类中,有一个名为preparelist()的方法,该方法更新数据库并填充数据。 在我的主要活动中,我使用默认的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

基本上,我想知道的是如何在MainActivity调用preparelist()方法,而不创建任何其他抽象类或类似的东西

解决方案1

Activity调用Fragment public方法:

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();

解决方案2

将删除功能移至片段:

  1. 在片段中移动删除操作,
  2. 在您的片段中,输入:

     @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setHasOptionsMenu(true); //this fragment can now override //options menu } 
  3. 现在,您将执行与活动中相同的操作,重写onCreateOptionsMenu()onOptionsItemSelected等。请注意,方法签名与Activity的签名不同。 请参阅片段文档。

相反,不是按ID查找片段,而是按TAG查找片段,因为该用途需要进行两次更改。 见下面的代码

FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.id_of_frame_layout_in_xml, myFragment ,"ADD_A_TAG_NAME_HERE");
        fragmentTransaction.commit();

用TAG名称替换ADD_A_TAG_NAME_HERE,id_of_frame_layout_in_xml将是xml中的框架布局,您将在其中添加/替换片段

现在您可以按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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM