【问题标题】:onActivityResult requestCode returns 0onActivityResult requestCode 返回 0
【发布时间】:2016-06-04 04:21:00
【问题描述】:

我有一个包含两个选项卡的片段的 MainActivity,每个选项卡中有一个片段(ChatListFragment 和 FriendListFragment)。每个片段都有 ListView。当用户点击 ListView 的每一行时,会显示 ChatActivity。

我希望 ChatListFragment 中的 ListView(使用 ListAdapter 作为调用 ChatActivity 的适配器)在 ChatActivity 关闭后更新其 ListView。我在代码中尝试了如下所示的 onActivityResult 方法,但 requestCode 始终为 -1。

MainActivity.java

public class MainActivity extends AppCompatActivity {

    ...

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.d(TAG, "onActivityResult: " + " " + requestCode + " == " + MYACTIVITY_REQUEST_CODE + " and " + resultCode + " == " + Activity.RESULT_OK);
        Log.d(TAG, "onActivityResult: " + MainActivity.class.getSimpleName());

        for (Fragment fragment : getSupportFragmentManager().getFragments()) {
            fragment.onActivityResult(requestCode, resultCode, data);
        }
    }

    ...
}

ChatListFragment.java

public class ChatListFragment extends Fragment {

    ...

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.d(TAG, "onActivityResult: " + TAG);
        Log.d(TAG, "onActivityResult: " + " " + requestCode + " == " + MYACTIVITY_REQUEST_CODE + " and " + resultCode + " == " + Activity.RESULT_OK);
        if ((requestCode == MYACTIVITY_REQUEST_CODE) && (resultCode == Activity.RESULT_CANCELED)) {
            List<Friend> friendList = getFriendChatList();
            adapter = new ListAdapter(getActivity(), R.layout.fragment_list, friendList, true);
            adapter.notifyDataSetChanged();
            listView.setAdapter(adapter);
            Log.d(TAG, "onActivityResult number of friend chats: " + getFriendChatList().size());
            if(friendList.isEmpty()) {
                linearLayout.setVisibility(View.VISIBLE);
            } else {
                linearLayout.setVisibility(View.GONE);
            }
        }
    }
}

ChatActivity.java

public class ChatActivity extends AppCompatActivity {

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

        ...

        if (getParent() == null) {
            setResult(Activity.RESULT_OK);
        } else {
            getParent().setResult(Activity.RESULT_OK);
        }
    }

    ...
}

ListAdapter.java

public class ListAdapter extends ArrayAdapter<Friend> {

   private static final int MYACTIVITY_REQUEST_CODE = 9000;

   public ListAdapter(Context context, int resource, List<Friend> objects, boolean isChat) {
        super(context, resource, objects);
        this.context = context;
    }

    @Override
    public View getView(final int position, final View convertView, ViewGroup parent) {
        View view = convertView;
        LayoutInflater layoutInflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        if(null == view) {
            view = layoutInflater.inflate(R.layout.list_friend, null);
        }

        final Friend friend = friendList.get(position);

        if(null != friend) {
            final CardView rowLayout = (CardView) view.findViewById(R.id.row_layout);
            final ImageView friendImage = (ImageView) view.findViewById(R.id.list_friend_image);
            final TextView friendName = (TextView) view.findViewById(R.id.list_friend_name);
            final TextView friendDescription = (TextView) view.findViewById(R.id.list_friend_description);
            final TextView friendLastChatTime = (TextView) view.findViewById(R.id.list_friend_lastChatTime);

            // Open chat activity
            rowLayout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(context, ChatActivity.class);
                    intent.putExtra(KEY_FRIEND_NAME, friend.getName());
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    ((Activity) context).startActivityForResult(intent, MYACTIVITY_REQUEST_CODE);
                }
            });
        }

        return view;
    }
}

【问题讨论】:

  • 你能分享你调用 ChatActivity 的代码吗?
  • 添加代码 ListAdapter 供您参考 :)

标签: java android listview android-fragments


【解决方案1】:

您需要创建一个 Intent,然后将 Result 设置为该 Intent。

在您的 ChatActivity 中尝试类似的操作

Intent intent=new Intent();

if (getParent() == null) {
            setResult(Activity.RESULT_OK,intent);
        } else {
            getParent().setResult(Activity.RESULT_OK,intent);
        }

      finish();

您还需要在设置结果后finish您的 ChatActivity。像这样:

我不明白,为什么你需要检查父类。你总是可以这样做

Intent intent= new Intent();
setResult(RESULT_OK,intent);
finish();

这应该可以正常工作。

希望这会有所帮助:)

【讨论】:

  • 我意识到,onActivtyResult总是在setResult之前被调用,导致resultCode != Activity.RESULT_OK :/
  • 我没听懂...你想说什么
【解决方案2】:

我知道这真的很晚了!但是,onActivityResult 不会得到你在setResult() 中设置的结果! 因为你在rowLayout.setOnClickListener中设置了Intent.FLAG_ACTIVITY_NEW_TASK

基于reference

当调用者从 正在启动的活动。

所以,首先,删除intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 然后setResult(RESULT_OK,intent);在合适的地方

在这种情况下,你会得到你设置的响应,在onActivityResult

【讨论】:

    猜你喜欢
    • 2015-01-29
    • 2019-08-13
    • 2012-05-20
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 2015-09-19
    相关资源
    最近更新 更多