Java – GetActivityForResult is obtained when startActivityForResult is returned in the adapter

GetActivityForResult is obtained when startActivityForResult is returned in the adapter… here is a solution to the problem.

GetActivityForResult is obtained when startActivityForResult is returned in the adapter

When the user hits back from the activity, I’m trying to return some data.

I’m calling startActivityForResult from the adapter, but when I actually press from the activity, onActivityResult never seems to be called

For example, the code is refined

fragment 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) {
    }

adapter

public Adapter(Context context, List<Item> objects) {
    super(context, -1, objects);
    this.context = context;
    addAll(objects);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = convertView;
    if (view == null) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.grid_view_item, parent, false);
    }

View recommendationLayout = view.findViewById(R.id.recommendation_layout);
    recommendationLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(getContext(), Activity.class);
            Bundle extras = new Bundle();
            extras.putBoolean("denyEditPermission", true);
            intent.putExtras(extras);

            ((Activity) context).((Activity) context).startActivityForResult(intent, 1);(intent, 1);
        }
    });
    return view;

Activity

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.detailed_view);

    Intent intent = getIntent();
    Bundle extras = intent.getExtras();
    denyEditPermission = extras.getBoolean("denyEditPermission");
}

@Override
public void onBackPressed() {
    Intent intent = new Intent();
    intent.putExtra("denyEditPermission", denyEditPermission);
    setResult(RESULT_OK, intent);
    finish();
}

Solution

Because you start an activity using activity a context, you will get onActivityResult callbacks in the activity, not in the fragment. To get callbacks in a fragment, you need to use the fragment context/launch activity in the fragment itself. I recommend using the interface approach to solve the problem here. Create an interface and implement it in your fragment, and when clicked recommendationLayout , call the interface method from the adapter so that you can handle the click event itself in the fragment.

Kind of like,

Create an interface file-

public interface RecommendationClickListener {

    public void onRecommendationClicked();
}

fragment :

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);
}

Adapter:

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();
            }
        }
    });

Related Problems and Solutions