【问题标题】:Start a fragment from MainActivity that calls another fragment. The listener returns to the MainActivity从调用另一个片段的 MainActivity 启动一个片段。监听器返回到 MainActivity
【发布时间】:2017-08-08 14:13:11
【问题描述】:

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

其中一个“选项卡”调用 Fragment(2=BaixarOrcamentoFragment.java),而后者又调用另一个 Fragment(3=FillReasonToBaixaFragment.java),因此用户可以插入文本。 Fragment(2) 实现了 Fragment(3) 用来返回“文本值”的监听器,因此 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,为侦听器加注星标,获取一些数据,显示文本输入,并通过将这个“文本”发送到接口完成:

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),即调用 Fragment(3) 的那个)。

MainActivity 不知道 Fragment(2) 内的任何视图的存在,这是先验的,一旦收到来自 Fragment(3) 的“文本”,它将依次更新所有这些视图。

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

我怎样才能做到这一点?

【问题讨论】:

    标签: android-fragments android-viewpager fragmentpageradapter


    【解决方案1】:

    大家下午。 我想出了如何做到这一点。 首先:我从 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());
    

    目标片段是 Fragment(2) 本身。 然后我在 Fragment(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 个标签。 Tab 4 永远不会被选为 currentItem,在下面的方法中:

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

    【讨论】:

      猜你喜欢
      • 2017-12-22
      • 1970-01-01
      • 2021-06-21
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-26
      相关资源
      最近更新 更多