【问题标题】:using onActivityResult in Fragments在片段中使用 onActivityResult
【发布时间】:2014-03-30 20:00:57
【问题描述】:

嗨,在片段中我想从联系人中选择一个电话号码并将其插入到 EditText 中

但它在片段中不起作用我在活动中使用它并且它起作用。请你帮我改一下

public class Encrypt extends Fragment {

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.encrypt, null);  
        phoneNumberDisplay = (EditText) v.findViewById(R.id.editTextPhoneNumber);
        contactsButton=(Button)v.findViewById(R.id.buttonContacts);
        contactsButton.setOnClickListener(new OnClickListener() {           
            @Override
            public void onClick(View v) {   
                if(v==contactsButton){
                    Intent intent=new Intent(Intent.ACTION_PICK,Contacts.CONTENT_URI);
                    intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
                    startActivityForResult(intent, 1);
                }
            }
        });

        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (resultCode == RESULT_OK) {
                Uri ur = data.getData();
                Cursor c = managedQuery(ur, null, null, null, null);
                if (c.moveToFirst()) {
                    String s = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    phoneNumberDisplay.setText(s);
                }
            }
        }
        return v;
    }

错误:RESULT_OK 无法解析为变量

方法 managedQuery(Uri, null, null, null, null) 对于 new 类型未定义 View.OnClickListener(){}

【问题讨论】:

  • 似乎还可以,您是否尝试调试并检查是否已调用 onActivityResult ?
  • @UdiOshi 无法运行它,它在 onActivityResult 下划线并写道:void 是变量 onActivityResult 的无效类型
  • @rgreso 看看我的回答,它可能解决了你的问题。

标签: java android onactivityresult


【解决方案1】:

好的,你有一个括号不合适。我想你希望 `onActivityResult 在点击监听器中。

    contactsButton.setOnClickListener(new OnClickListener() {           
        @Override
        public void onClick(View v) {   
            if(v==contactsButton){
                Intent intent=new Intent(Intent.ACTION_PICK,Contacts.CONTENT_URI);
                intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
                startActivityForResult(intent, 1);
            }
        }
    });
//   ^^
// This parenthesis should not be here

去掉括号和分号,在此处添加:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            Uri ur = data.getData();
            Cursor c = managedQuery(ur, null, null, null, null);
            if (c.moveToFirst()) {
                String s = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                phoneNumberDisplay.setText(s);
            }
        }
    });
//   ^^
//  Here, so that it is in the event listener

注意:因为我修复了您帖子中的缩进,所以我看到了这个错误。下次,尽量正确缩进你的代码,这样你就会看到那种错误(这也是我不喜欢 K&R 大括号样式的原因)。

更新: 它是Activity.RESULT_OK,而不是原始的RESULT_OK

对于managedQuery:参见this question

对于getContentManager:参见here

【讨论】:

  • 感谢您的回答!是的,它修复了该错误,但它没有将选定的联系人插入到我的 editText 中,当我在另一个项目的 Activity 中有相同的代码时,它会插入它
  • 你能评论if(v==contactsButton)(和它的右大括号)看看它是否有效吗? (呃,为什么java中的UI这么迟钝?)
  • 对不起,我还没有提到还有另一个错误...它不知道 RESULT_OK(在 Activity 中确实如此),并且它想要实现 managedQuery(在 Activity 中它不知道)。只有当我删除 if*(resultCode==RESULT_OK) 并创建未实现的 managedQuery 方法时,它才会运行。对不起,我现在意识到了。我不知道如何实现我真正初学者的 managedQuery 方法以及我在一些教程中找到的代码并在 Activity 中进行测试。
  • 你能把你问题的所有错误都贴出来吗? (不修改他们的文字)。
  • 请回答您的问题。不作为评论。
【解决方案2】:

要通过手机访问联系人,请确保您在清单文件中添加了android.permission.READ_CONTACTS 权限..

【讨论】:

  • 是的,我有这个权限。它写给我的信是:void 是变量 onActivityResult 的无效类型
  • @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) return; uri ur = data.getData();光标 c = managedQuery(ur, null, null, null, null); if (c.moveToFirst()) { String s = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); phoneNumberDisplay.setText(s); } }
【解决方案3】:

这可能有两个可能的原因。

  1. 使用 Activity 的引用调用您的 statrtActivityForResults,例如

    getActivity().startActivityForResult(intent, 1);
    
  2. 在你 onActivityResult() 中调用 super.onActivityResult(requestCode, resultCode, data) 作为@marcin_j 也指出。

尝试其中一个或两个。看看哪一种适合你。

这是link.

【讨论】:

  • 不可能运行它,它在 onActivityResult 下划线并写道:void 是变量 onActivityResult 的无效类型
  • 您在 View v 中返回错误的位置,即 onActivityResult。它应该在 onCreateView 方法中。
【解决方案4】:

当 onActivityResult 是 void 返回函数时,你试图返回值,你需要实现你的逻辑而不返回任何值

【讨论】:

    【解决方案5】:
      public String getPath(Uri uri) {
        // just some safety built in
        if( uri == null ) {
            // TODO perform some logging or show user feedback
            return null;
        }
        // try to retrieve the image from the media store first
        // this will only work for images selected from gallery
        String[] projection = { MediaStore.Images.Media.DATA };
        Activity ac =new Activity();
        Cursor cursor =ac.managedQuery(uri, projection, null, null, null);
        if( cursor != null ){
            int column_index = cursor
                    .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        }
        // this is our fallback here
        return uri.getPath();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-03
      相关资源
      最近更新 更多