Java 从适配器中的startActivityForResult返回时获得onActivityResult

Java 从适配器中的startActivityForResult返回时获得onActivityResult,java,android,Java,Android,我试图在用户单击活动返回时返回一些数据 我正在从适配器调用startActivityForResult,但当我从活动中实际按下返回键时,似乎从未调用onActivityResult 例如,代码被删减 片段1 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreate(savedInstanceStat

我试图在用户单击活动返回时返回一些数据

我正在从适配器调用startActivityForResult,但当我从活动中实际按下返回键时,似乎从未调用onActivityResult

例如,代码被删减

片段1

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    View mainView = inflater.inflate(R.layout.grid_view, container, false);

    return mainView;
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    mAdapter = new Adapter(this.getActivity(), new ArrayList<Item>());
    mGridView = (StaggeredGridView) getView().findViewById(R.id.grid_view);
    mGridView.setAdapter(mAdapter);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.w(TAG, "in activity result");
    if (requestCode == 1 && resultCode == Activity.RESULT_OK) {
    }

由于您使用
activity
上下文来启动活动,因此将在活动中而不是片段中获得
onActivityResult
回调。要在片段中获取回调,您需要在片段本身中使用片段上下文/启动活动。我建议使用接口方法来解决这个问题。创建一个接口并在片段中实现它,当单击
recommendationLayout
时,从适配器调用接口方法,以便您可以处理片段本身中的单击事件

大概

创建一个接口文件-

public interface RecommendationClickListener {

    public void onRecommendationClicked();
}
片段:

public class MyFragment extends Fragment implements RecommendationClickListener{
...
...
...

@Override
    public void onRecommendationClicked() {
        Intent intent = new Intent(getActivity(), NextActivity.class);
        Bundle extras = new Bundle();
        extras.putBoolean("denyEditPermission", true);
        intent.putExtras(extras);

        startActivityForResult(intent, 1);

    }

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    mAdapter = new Adapter(this.getActivity(), new ArrayList<Item>());
    mAdapter.setRecommendationClickListener(this);
    mGridView = (StaggeredGridView) getView().findViewById(R.id.grid_view);
    mGridView.setAdapter(mAdapter);
}
private RecommendationClickListener mRecommendationClickListener;


    public void setRecommendationClickListener(RecommendationClickListener recommendationClickListener) {
        this.mRecommendationClickListener = recommendationClickListener;
    }

View recommendationLayout = view.findViewById(R.id.recommendation_layout);
    recommendationLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mRecommendationClickListener != null) {
                mRecommendationClickListener.onRecommendationClicked();
            }
        }
    });

广播解决方案如下:

在片段中

在类的顶部声明

public final static String START_ACT = "com.yourcompanyname.appname.START_ACT";

private Radio radio;
在createView上启动并注册接收器

    //Initiate our receiver
    radio = new Radio();

    //Activate our recevier
    getActivity().getApplicationContext().registerReceiver(radio, new IntentFilter(START_ACT));
同样在片段中,创建receiver类和调用活动的方法

/**
 * Receiver Class
 * This setup checks for the incoming intent action to be able to
 * attach more messages to one receiver.
 */
private class Radio extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent.getAction().equals(START_ACT)){
            getDataFromActivity();
        }

    }
}

public void getDataFromActivity(){

    Intent intent = new Intent(getActivity(), Activity.class);
    Bundle extras = new Bundle();
    extras.putBoolean("denyEditPermission", true);
    intent.putExtras(extras);
    startActivityForResult(intent, 1);


}
之后,从应用程序中的任何位置向我们的收音机发送消息

context.sendBroadcast(new Intent(Fragment1.START_ACT));

请尝试删除finish()并执行super.onBackPressed();相反,谢谢你的主意。刚刚尝试过,但仍然不起作用。super.on backpressed您仍然必须执行此操作,而不是完成…现在您可以尝试删除onActivity结果中的requestCode==1&&吗?是的,我尝试了之前/之后和而不是。在onActivityResult中,我将在检查请求代码之前输出到日志中。我确实有另一个被调用的活动,但从Fragment1调用并返回OK。我觉得这与在适配器中调用startActivityForResult有关?谢谢。我试过类似的方法,但做错了。谢谢你给我指明了正确的方向。我很高兴这有帮助:)
/**
 * Receiver Class
 * This setup checks for the incoming intent action to be able to
 * attach more messages to one receiver.
 */
private class Radio extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent.getAction().equals(START_ACT)){
            getDataFromActivity();
        }

    }
}

public void getDataFromActivity(){

    Intent intent = new Intent(getActivity(), Activity.class);
    Bundle extras = new Bundle();
    extras.putBoolean("denyEditPermission", true);
    intent.putExtras(extras);
    startActivityForResult(intent, 1);


}
context.sendBroadcast(new Intent(Fragment1.START_ACT));