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

时间:2015-04-28 05:26:10

标签: java android android-fragments

我正在实现一个数据库,因为我需要准备列表或每次进行一些更改时更新它。我在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方法而不进行任何其他抽象类或类似

2 个答案:

答案 0 :(得分:1)

解决方案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();

解决方案2

将删除功能移动到您的片段:

  1. 在您的片段中移动您的删除操作
  2. 你片段中的
  3. 写道:

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setHasOptionsMenu(true);        //this fragment can now override
                                    //options menu
    }
    
  4. 现在执行与您在活动中相同的操作,覆盖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);