onActivityResult未通过自定义适配器在片段对话框中调用

时间:2017-01-10 11:41:36

标签: android android-fragments onactivityresult

Android新手。我有以下情况:

  1. 应用程序在主活动中启动,在这里我添加了一个片段
  2. 在该片段中是一个使用自定义适配器填充的listview,我将FragmentActivity的实例传递给适配器。 拨打:

    ExpandableListAdapter listAdapter new ExpandableListAdapter(mContext, mActivity, listDataHeader, listDataChild);
    
  3. 实现:

     public ExpandableListAdapter(Context context, FragmentActivity activity, List<String> listDataHeader, HashMap<String, List<String>> listChildData) {
            this._context = context;
            this._activity = activity;
            this._listDataHeader = listDataHeader;
            this._listDataChild = listChildData;
        }
    
    1. 当您单击列表中的某个项目时,它会打开一个包含edittext字段的对话框,即:Name,Surname,Cell。我将FragmentActivity作为上下文传递给对话框:

      txtListChild.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      final Dialog dialog = new SelectContactDialog(_activity);
                      dialog.show();
                  }
              });
      
    2. 然后当您关注3个字段中的任何一个时,会打开一个Select联系人,我正在使用传递的FragmentActivity来调用startActivityForResult,如下所示:

      private class ContactListener extends Activity implements View.OnFocusChangeListener
      {
          @Override
          public void onFocusChange(View v, boolean hasFocus) {
              if (hasFocus) {
                  Intent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);
                  _activity.startActivityForResult(intent, CONTACTS_RESULT);
              }
          }
      
          @Override
          protected void onActivityResult(int requestCode, int resultCode, Intent data) {
              super.onActivityResult(requestCode, resultCode, data);
      
              if (requestCode == CONTACTS_RESULT && resultCode == RESULT_OK) {
                  String cell = "?", firstName = "?", lastName = "?";
      
                  uriContact = data.getData();
      
                  Cursor cursor = null;
      
                  mCell.setText(cell);
                  mLastName.setText(lastName);
                  mFirstName.setText(firstName);
              }
          }
      }
      
    3. 到目前为止,一切正常。所以我现在的问题是当用户选择联系人时我想得到结果。我尝试过,但永远不会调用onActivityResult覆盖方法。我不知道该怎么做,似乎其他人与我的不同,他们的解决方案对我不起作用。

      任何人都知道我能做什么?

2 个答案:

答案 0 :(得分:2)

我建议使用接口。例如,创建必须在活动中实现的接口ContactCallback。创建适配器时,传递this(表示接口)。单击适配器内的项目调用时,会传递回调,如callback.onContactSelected()。在您的活动中实施的onContactSelected()内,您可以打开对话框。

<强>更新

问题是您的onActivityResult()从未被调用过:

您的清单中是否有一行名为"android:launchMode="singleTask"?删除它,它应该被调用。以下情况可能会导致收到结果的问题:

  • 检查您是否正确使用startActivityForResult(),请勿使用startActivity()

  • 如果您在覆盖onBackPressed方法中执行某项操作,则super.onBackPressed();必须位于方法的最后一位,而不是第一行。

  • 删除清单或等效参数中的android:launchMode="singleInstance"以创建意图。

  • 删除被调用活动清单中的noHistory="true"

  • 检查错过了setResult()

  • 调用
  • finish()来关闭活动。使用finishActivity()关闭被叫活动。

  • 使用requestCode大于零。负值不起作用。

答案 1 :(得分:-2)

您需要调用它来调用onActivityResult。在你关闭的对话框中放入此代码

   Intent returnIntent = new Intent();
    returnIntent.putExtra("result",result);
    setResult(Activity.RESULT_OK,returnIntent);
    finish();