自定义RecyclerAdapter和startActivityForResult
我有一个包含RecyclerView
的Fragment
,它使用自定义的RecyclerAdapter
。 我在自定义的RecyclerAdapter
有一个onClickListener
– 当点击一个位置时我希望它启动startActivityForResult
。 到目前为止,这样可以在单击它时根据需要启动Activity。 但是,当我按下后退按钮转到包含RecyclerView
的Fragment
, onActivityResult
永远不会被调用。 我已将上下文传递给自定义RecyclerAdapter
。 这是可能的吗? 或者,Activity / Fragment启动startActivityForResult
会拦截它? 如果不是,我将最终使用手势检测器或类似的东西处理片段中的onClick,但在此之前我想给这个公平的裂缝! 注意:我在MainActivity
包含onActivityResult
,它包含Fragment
容器,因此如果从Fragment
启动startActivityForResult
, Fragment
会接收onActivityResult
。 我的代码:
RecyclerAdapter onClickListener:
@Override public void onClick(View v) { String titleId = titlesListDataArrayList.get(getLayoutPosition()).getTitle_id(); Intent intent = new Intent(context, CreateItemsActivity.class); intent.putExtra("TITLE_ID", titleId); ((Activity) context).startActivityForResult(intent, Constants.NEW_ITEMS_REQUEST_CODE); }
CreateItemsActivity.class – onBackPressed()
@Override public void onBackPressed() { Intent intent = new Intent(); setResult(Constants.NEW_ITEMS_REQUEST_CODE, intent); finish(); }
MyListsFragment.class(包含RecyclerView)
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Log.e("CALLED", "OnActivity Result"); // if requestCode matches from CreateItemsActivity if (requestCode == Constants.NEW_ITEMS_REQUEST_CODE) { Log.e("REQUEST CODE", String.valueOf(requestCode)); populateRecyclerView(); } }
另外我在MainActivity中有这个:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // included to allow fragment to receive onActivityResult }
好的,所以如果有人在这里遇到这个问题就是我的
解。 我将此代码添加到MainActivity onActivityResult中(注意我有一个框架容器,这是所有碎片都膨胀的地方):
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // get current fragment in container Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.frameContainer); fragment.onActivityResult(requestCode, resultCode, data); }
我相信这是有效的,因为MainActivity在层次结构中排名第一,并拦截onActivityResult,所以基本上我只是将它指向我希望它被使用的位置。
只有在第二个活动完成并且执行了setResult
时,才会调用您的调用活动onActivityResult
。
由于用户正在按下后退按钮,因此第二个活动正在完成,而不会调用setResult
。
您需要覆盖onBackPressed
以便执行setResult
代码。
我看到你已经实现了这个,但我认为问题的关键在于你需要返回Activity.RESULT_OK
而不是你的请求代码。
@Override public void onBackPressed() { Intent intent = new Intent(); setResult(RESULT_OK, intent); super.onBackPressed(); }
在这种情况下,您不需要显式返回Constants.NEW_ITEMS_REQUEST_CODE
的requestCode
,因为Android会自动转发它。