自定义 RecyclerAdapter 和 startActivityForResult
Custom RecyclerAdapter and startActivityForResult
我有一个 Fragment
,其中包含一个使用自定义 RecyclerAdapter
的 RecyclerView
。我的自定义 RecyclerAdapter
中有一个 onClickListener
- 当点击一个位置时,我希望它开始 startActivityForResult
。到目前为止,它的工作原理是,当它被点击时,它会根据需要启动 Activity。但是,当我按下后退按钮转到包含 RecyclerView
的 Fragment
时,永远不会调用 onActivityResult
。我已经将上下文传递给自定义 RecyclerAdapter
。这是可能的吗?还是发起 startActivityForResult
的 Activity/Fragment 拦截了它?如果不是,我最终会使用手势检测器或类似的东西处理 Fragment 中的 onClick,但在此之前我想给它一个公平的破解!注意:我已将 onActivityResult
包含在具有 Fragment
容器的 MainActivity
中,因此如果 startActivityForResult
是从Fragment
。我的代码:
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();
}
}
我在主目录中也有这个Activity:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// included to allow fragment to receive onActivityResult
}
您的调用活动 onActivityResult
只会在第二个 activity 完成并且 setResult
已执行时被调用。
由于用户按下后退按钮,第二个 activity 正在完成而没有调用 setResult
。
您需要覆盖 onBackPressed
才能执行您的 setResult
代码。
我看到你已经实现了这个,但我认为问题的症结在于你需要 return Activity.RESULT_OK
而不是 你的请求代码。
@Override
public void onBackPressed() {
Intent intent = new Intent();
setResult(RESULT_OK, intent);
super.onBackPressed();
}
在这种情况下,您不需要明确地 return 您的 requestCode
或 Constants.NEW_ITEMS_REQUEST_CODE
因为 Android 会自动转发。
好的,所以如果其他人遇到这个问题,我的
解决方案。我将此代码添加到 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,所以基本上我只是将它指向我想要使用它的地方。
我有一个 Fragment
,其中包含一个使用自定义 RecyclerAdapter
的 RecyclerView
。我的自定义 RecyclerAdapter
中有一个 onClickListener
- 当点击一个位置时,我希望它开始 startActivityForResult
。到目前为止,它的工作原理是,当它被点击时,它会根据需要启动 Activity。但是,当我按下后退按钮转到包含 RecyclerView
的 Fragment
时,永远不会调用 onActivityResult
。我已经将上下文传递给自定义 RecyclerAdapter
。这是可能的吗?还是发起 startActivityForResult
的 Activity/Fragment 拦截了它?如果不是,我最终会使用手势检测器或类似的东西处理 Fragment 中的 onClick,但在此之前我想给它一个公平的破解!注意:我已将 onActivityResult
包含在具有 Fragment
容器的 MainActivity
中,因此如果 startActivityForResult
是从Fragment
。我的代码:
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();
}
}
我在主目录中也有这个Activity:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// included to allow fragment to receive onActivityResult
}
您的调用活动 onActivityResult
只会在第二个 activity 完成并且 setResult
已执行时被调用。
由于用户按下后退按钮,第二个 activity 正在完成而没有调用 setResult
。
您需要覆盖 onBackPressed
才能执行您的 setResult
代码。
我看到你已经实现了这个,但我认为问题的症结在于你需要 return Activity.RESULT_OK
而不是 你的请求代码。
@Override
public void onBackPressed() {
Intent intent = new Intent();
setResult(RESULT_OK, intent);
super.onBackPressed();
}
在这种情况下,您不需要明确地 return 您的 requestCode
或 Constants.NEW_ITEMS_REQUEST_CODE
因为 Android 会自动转发。
好的,所以如果其他人遇到这个问题,我的
解决方案。我将此代码添加到 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,所以基本上我只是将它指向我想要使用它的地方。