【问题标题】:How to refresh previous fragment after closing an activity who was started inside an Adapter?关闭在适配器内启动的活动后如何刷新上一个片段?
【发布时间】:2016-08-18 19:39:13
【问题描述】:

我有一个带有 RecyclerView 的片段 (FragmentA),其中显示了一些 CardView。我想让cardviews clickable,所以我找到的解决方案是在de适配器类的ViewHolder中实现View.OnClickListener。像这样的:

fragmentAAdapter.java

public class fragmentAViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {       

    public fragmentAViewHolder (View itemView) {
        super(itemView);            

        itemView.setOnClickListener(this);
    }     

    @Override
    public void onClick(View v) {
        //do something..
    }
}

onClick() 方法从被点击的卡片视图中获取数据并启动一个显示数据的活动(InfoActivity)。

OnClick() 方法

@Override
    public void onClick(View v) {            
        Intent intent = new Intent(itemView.getContext(), InfoActivity.class);

        Bundle mBundle = new Bundle();
        mBundle.putParcelable("someData", someData);
        intent.putExtras(mBundle);            
        itemView.getContext().startActivity(intent);
    }

在 InfoActivity 中,我可以更新和删除数据。之后,我想完成 InfoActivity 并刷新 FragmentA 以获取新数据。

要关闭活动并刷新上一个片段,我正在尝试使用 startActivityForResult()。像这样:

@Override
    public void onClick(View v) {            
        Intent intent = new Intent(itemView.getContext(), InfoActivity.class);       

        ((Activity)  itemView.getContext()).startActivityForResult(intent, 10001);

    }

InfoActivity.java

@Override
    public void onClick(DialogInterface dialog, int which) {        
    setResult(InfoActivity.RESULT_OK);
    finish();
}

FragmentA.java

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    if ((requestCode == 10001) && (resultCode == InfoActivity.RESULT_OK)) {

        FragmentAfragment  = new FragmentA();
        android.support.v4.app.FragmentTransaction fragmentTransaction =
                getFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.fragment_container, fragment);
        fragmentTransaction.commit();
    }
}

但是当我关闭 InfoActivity 时,什么也没有发生。

问题setResult(InfoActivity.RESULT_OK)返回结果给适配器类(fragmentAAdapter)而不是FragmentA,所以方法onActivityResult( ) 在 FragmentA 中永远不会被调用。

关闭在fragmentAAdapter的onClick()方法内启动的InfoActivity后如何刷新FragmentA?


更新 - 解决方案

我在 FragmentA 的活动中重写了 onActivityResult() 方法。像这样:

MainActivity.java

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);
    if ((requestCode == 10001) && (resultCode == 10001)) {

        FragmentA fragment  = new FragmentA();
        android.support.v4.app.FragmentTransaction fragmentTransaction =
                getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.fragment_container, fragment);
        fragmentTransaction.commit();
    }
}

InfoActivity.java中:

@Override
public void onClick(DialogInterface dialog, int which) {        
    setResult(10001);
    finish();
}

每次它关闭一个活动并返回FragmentA时,都会调用MainActivity中的onActivityResult(),并且当条件if((requestCode == 10001) && (resultCode == 10001)) em> 为 true 刷新 FragmentA。

【问题讨论】:

  • 您可以在调试模式下轻松验证您的怀疑。只需在onActivityResult() 中放置一个断点,看看它是否命中。如果没有,我们肯定会知道这是问题所在。
  • @Vucko 是的,这就是问题所在。我按照你说的做了,甚至没有调用 onActivityResult()。
  • 如果一切都失败了,我可以为不同组件之间的通信提供替代解决方案 - EventBus

标签: java android android-fragments


【解决方案1】:

在您的片段的活动中,您可以执行以下操作:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    requestCode &= 0xffff;
    for (Fragment fragment : getSupportFragmentManager().getFragments()) {
        if (fragment != null) {
            fragment.onActivityResult(requestCode, resultCode, data);
        }
    }
    super.onActivityResult(requestCode, resultCode, data);
}

或者您可以使用事件总线,例如:http://square.github.io/otto/

【讨论】:

  • 感谢您的回答。在片段的活动中覆盖 onActivityResult() 帮助我解决了我的问题。我将使用我使用的解决方案更新我的问题。
【解决方案2】:

你发出的问题是这样的

片段(startActivityForResult()) -> 活动

片段(onActivityResult()) setResult(Result_OK))

你应该避免在你的活动类中使用onActivityResult(),因为活动在这个过程中的角色只是一个将数据发送回片段的邮件。

如果你要调用片段内的活动,你可以直接调用它getActivity().startActivityForResult()

片段(getActivity().startActivityForResult) -> 活动

活动(onActivityResult())setResult(Result_OK))

#Options

活动(循环片段并找到片段并像 Agustin Sivoplas 建议的那样调用 onActivityResult()。)-> 片段

即使你在adapter view holder里面,它也应该在fragment里面。尽量利用fragment函数,不要在Activity中编写额外的代码

可能重复

onActivityResult is not being called in Fragment

【讨论】:

    猜你喜欢
    • 2014-12-10
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多