【问题标题】:How do I Log an object's keys and values如何记录对象的键和值
【发布时间】:2015-02-19 19:16:28
【问题描述】:

在我的 Android 应用程序中,我有一个包含用户联系人列表的姓名和电话号码的类。我还有一个列出联系人姓名的微调器。当用户从微调器中选择姓名时,我想Log 联系人的姓名和号码。

这里是MainActivity.java

package com.example.mycompy.myapp;

import android.content.ContentResolver;
import android.database.Cursor;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.provider.ContactsContract;

import java.util.ArrayList;


public class MainActivity extends ActionBarActivity implements AdapterView.OnItemSelectedListener {
    // this class will hold contact names and numbers
    public class ContactInfo {
        public String contactName, phoneNumber;

        public ContactInfo(String contactName, String phoneNumber){
            this.contactName = contactName;
            this.phoneNumber = phoneNumber;
        }

        @Override
        public String toString(){
            return contactName;
        }
    }

    public Spinner contactSpinner;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ArrayList<ContactInfo> contactList = new ArrayList<ContactInfo>();
        ContentResolver cr = getContentResolver();
        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null); // A SQL query for contacts data table, in Java form, I think...
        contactSpinner = (Spinner) findViewById(R.id.contact_list);
        contactSpinner.setOnItemSelectedListener(this);

        // If there are contacts, this code goes
        if(cur.getCount()>0){
            while(cur.moveToNext()){
                String id = cur.getString(
                        cur.getColumnIndex(ContactsContract.Contacts._ID)
                );
                String name = cur.getString(
                        cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)
                );

                if(
                    Integer.parseInt(
                            cur.getString(
                                cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)
                            )
                    ) > 0
                ){
                    Cursor pCur = cr.query(
                            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                            null,
                            ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
                            new String[]{id},null
                    );
                    while(pCur.moveToNext()){
                        String phone = pCur.getString(
                                pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)
                        );

                        // Add contact's info to `contactList`
                        ContactInfo newContact = new ContactInfo(name,phone);
                        contactList.add(newContact);
                        Log.v("onCreate", String.valueOf(newContact));
                    }
                    pCur.close();
                }
            }
        }

        // Add items to spinner
        ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_spinner_dropdown_item,contactList);
        contactSpinner.setAdapter(adapter); // Spinner shows contact names only, which is what I want spinner to show
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
        parent.getItemAtPosition(pos);
        Log.v("onItemSelected", String.valueOf(parent.getItemAtPosition(pos))); // When user selects a contact, this Logs just the contact name, but I want contact name AND number
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {
        // Another interface callback
    }

    // Rest of code...
}

如何编辑onItemSelected() 以便Logs 选择联系人姓名和电话号码?

【问题讨论】:

  • 当问题只是关于从您的 ContactInfo 类记录信息时,您不需要显示所有这些 Android 代码。

标签: java android class object spinner


【解决方案1】:

当 String.valueOf(Object) 方法从给定对象调用 toString 方法时,您可以对其进行编程以准确打印您想要的内容。

试试这样的

public class ContactInfo {
    public String contactName, phoneNumber;

    public ContactInfo(String contactName, String phoneNumber){
        this.contactName = contactName;
        this.phoneNumber = phoneNumber;
    }

    @Override
    public String toString(){
        return contactName + " - " + phoneNumber;
    }
}

【讨论】:

  • 您还应该为名称和编号添加 getter,否则,迟早有人会尝试解析 toString 返回值以获取各个部分。我认为 Josh Bloch 在 Effective Java 中谈到了这一点,也许在第 10 条或第 50 条中。
  • @Patrick Right,但我希望微调器只显示名称,而 Log 显示名称和编号。使用您的代码,微调器显示两者。有没有办法让微调器只显示名称,而 Log 显示两者?
  • @Generic_User_ID 您可以将Adapter 的子类用于仅使用名称的微调器,而不是使用 toString() 命令。
  • @Generic_User_ID 您可以创建另一个方法来返回您想要记录的字符串并保持 toString 不变。想象一下新方法名是toLogString(),那么,调用Log.v("OnItemSelected", parent.getItemAtPosition(pos).toLogString());
猜你喜欢
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 2021-04-13
  • 2016-09-16
  • 1970-01-01
相关资源
最近更新 更多