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

时间:2015-02-24 15:29:30

标签: java android

我试图在用户点击“活动”时返回一些数据。

我从适配器调用startActivityForResult,但是当我实际按下Activity时,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) {
    }

适配器

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;

活动

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

2 个答案:

答案 0 :(得分:1)

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

类似的东西,

创建界面文件 -

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

答案 1 :(得分:0)

广播解决方案如下:

在片段中

在课堂上声明

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

同样在片段中,创建接收器类和调用Activity

的方法
/**
 * 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));