从MainActivity启动一个调用另一个片段的片段。听众返回MainActivity

时间:2017-08-08 14:13:12

标签: android-fragments android-viewpager fragmentpageradapter

大家早上好。 我在这里处境尴尬。

My MainActivity(1)使用SectionPagerAdapter和ViewPager实现FragmentStatePagerAdapter。它工作正常,除了问题我必须调用getItemPosition来更新其中一个片段,这会导致整个事情被重新创建。总之...

其中一个"标签",调用片段(2 = BaixarOrcamentoFragment.java),而片段又调用另一个片段(3 = FillReasonToBaixaFragment.java),因此用户可以插入文本。 Fragment(2)实现了Fragment(3)用来返回"文本值"的LISTENER,因此Fragment(2)可以继续并完成它的任务。 这是Fragment(2)中的代码,它调用Fragment(3):

FragmentManager fragmentManager = getFragmentManager();
                                FillReasonToBaixaFragment fillFragment = new
                                    FillReasonToBaixaFragment();
                                Bundle args = new Bundle();
                                args.putInt("ORCID", baixarModelList.get(masterPosition)
                                                                    .getOrcGroupID());

                                fillFragment.setArguments(args);
                                fillFragment.show(fragmentManager, FILL_REASON_TO_BAIXA);

然后,Fragment(3)获取包ORCID,为监听器加注星标,获取一些数据,显示文本输入,并通过发送" text"结束。到界面:

BaixaItemdoOrcamentoListener listener = (BaixaItemdoOrcamentoListener) this
            .getContext();

..然后使用此接口(侦听器)返回收集的内容(文本):

 public interface BaixaItemdoOrcamentoListener
{
    void OnFinishedFillReason(String mEditext);
}

但是,它没有返回Fragment(2),它调用了Fragment(3),在那里我实现了接收这个返回值的方法:

  @Override
public void OnFinishedFillReason(String mEditext)
{}

它显示了一个强制转换错误,说 .MainActivity无法强制转换为.FillReasonToBaixaFragment $ BaixaItemdoOrcamentoListener

我继续在MainActivity中声明了OnFinishedFillReason,它实现了FillReasonToBaixaFragment.BaixaItemdoOrcamentoListener。

现在请注意,任务的实际执行情况在Fragment(2)中。

猜猜是什么:当我在Fragment(3)中输入文本并按(android:imeOptions =" actionDone")时,它返回到MainActivity,而不是Fragment(2),那个称为片段(3)。

MainActivity并不知道片段(2)中任何一个视图的存在,这是一个先验,它将反过来更新所有这些视图ONCE收到" text"来自Fragment(3)。

也许我没有彻底搜查,但我找不到任何类似这种情况的东西。

如何实现这一目标的任何线索?

提前谢谢你们。 最好的问候。

1 个答案:

答案 0 :(得分:0)

下午大家。 我想出了如何实现这一目标。 第一:我从Fragment(2)中删除了OnFinishedFillReason接口,因此从Fragment(3)中删除了。 在Fragment(2)中,我像这样开始了Fragment(3),设置了一个 setTargetFragment

FragmentManager fragmentManager = getFragmentManager();
                                FillReasonToBaixaFragment fillFragment = new
                                    FillReasonToBaixaFragment();
                                fillFragment.setTargetFragment(BaixaOrcamentoFragment.this,
                                                               FILL_REASON_TO_BAIXA);
                                Bundle args = new Bundle();
                                args.putInt("ORCID", baixarModelList.get(masterPosition)
                                                                    .getOrcGroupID());

                                fillFragment.setArguments(args);
                                fillFragment.show(fragmentManager,
                                                  this.getClass().getSimpleName());

目标片段是片段(2)本身。 然后我在片段(2)中添加了:

 @Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if (requestCode == FILL_REASON_TO_BAIXA && resultCode == Activity.RESULT_OK)
    {// code in here }

在Fragment(3)中,我在onCreate(Bundle savedInstanceState)方法中添加了以下内容:

 targetFragment = getTargetFragment();
    if (targetFragment instanceof BaixaOrcamentoFragment)
    {
        orcID = getArguments().getInt("ORCID");
    }

在返回元素的末尾,如下所示:

Intent returnData = new Intent();
            Bundle bundle = new Bundle();            
            bundle.putString("EDITTEXT", txtEdited);
            returnData.putExtras(bundle);
            targetFragment.onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, returnData);
            this.dismiss();
            return true;

然后,在 onActivityResult 中,我收集了数据,如下所示:

 Bundle returnedValues = data.getExtras();
        String mRazao = returnedValues.getString("EDITTEXT").trim();

就是这样。

但我仍有问题:我有6个标签。在下面的方法中,选项卡4从未被选为currentItem:

@Override
public void onPageSelected(int position)
{
    mViewPager.setCurrentItem(position);
}

关心大家!