将联系人的姓名和号码设置为工具栏的标题和副标题

Posted

技术标签:

【中文标题】将联系人的姓名和号码设置为工具栏的标题和副标题【英文标题】:Setting contact's name and number to title and subtitle into a toolbar 【发布时间】:2020-09-27 22:36:11 【问题描述】:

我构建了一个从手机(在本例中为我的手机)读取联系人的应用程序。对于显示联系人的活动,我使用了 TabLayout 和 ViewPager。为了显示我使用 RecyclerView 的联系人。关键是我处理它如何读取联系人,然后我的下一个动作是在单击联系人后打开一个外部活动 (MessageToContact_Activity)。在此活动中(MessageToContact_Activity),我想向我选择的联系人发送消息,为此我首先尝试。我决定使用工具栏而不是默认的 ActionBar,因为它更灵活。问题是我不知道如何获取 name 和 number 的值并将它们用于 MessageToContact_Activity。

这是 Contacts_Fragment 的实现:

        public class Contacts_Fragment extends Fragment 
            View v;

            public Contacts_Fragment() 
            

            @Nullable
            @Override
            public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) 
                v = inflater.inflate(R.layout.contacts_fragment, container, false);

                RecyclerView recyclerView = v.findViewById(R.id.recycleView_search);
                LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
                RecyclerView.LayoutManager layoutManager = linearLayoutManager;
                recyclerView.setLayoutManager(layoutManager);
                ContactsAdapter adapter = new ContactsAdapter(getContext(), getContacts());
                recyclerView.setAdapter(adapter);

                return v;
            

            private List<ContactModel> getContacts() 

                List<ContactModel> list = new ArrayList<>();

                if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) 
                    ActivityCompat.requestPermissions(getActivity(), new String[]Manifest.permission.READ_CONTACTS, 1);
                

                Cursor cursor = getContext().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                        null, null, ContactsContract.Contacts.DISPLAY_NAME + " ASC");

                cursor.moveToFirst();

                while (cursor.moveToNext()) 
                    list.add(new ContactModel(cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
                    )), cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))));
                

                return list;
            
        

这是 ContactsAdapter 的实现:

    public class ContactsAdapter extends RecyclerView.Adapter<ContactsAdapter.ViewHolder> 

        private Context mContext;
        private LayoutInflater inflater;
        private List<ContactModel> mListContacts;

        public ContactsAdapter(Context context, List<ContactModel> listContacts)
            this.mContext = context;
            this.mListContacts = listContacts;
        

        @NonNull
        @Override
        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) 
            inflater = LayoutInflater.from(mContext);
            View view = inflater.inflate(R.layout.item_contact,parent, false);
            final ViewHolder viewHolder = new ViewHolder(view);

            viewHolder.item_contact.setOnClickListener(new View.OnClickListener()

                @Override
                public void onClick(View view) 
                    Toast.makeText(mContext, "Test Click "+String.valueOf(viewHolder.getAdapterPosition()), Toast.LENGTH_SHORT).show();

                    /*This is where I've tried to get them with setters and use them
                            with getters in MessageToContact_Activity*/
                    String name = mListContacts.get(viewHolder.getAdapterPosition()).getName();
                    String number = mListContacts.get(viewHolder.getAdapterPosition()).getNumber();

                    MessageToContact_Activity mC = new MessageToContact_Activity();
                    mC.setName(name);
                    mC.setNumber(number);
                    /*----------------------------------------------------------------------------*/

                    onContactClick(view);
                
            );
            return viewHolder;
        

        public void onContactClick(View v)
            Intent myIntent = new Intent(v.getContext(), MessageToContact_Activity.class);
            mContext.startActivity(myIntent);
        

        @Override
        public void onBindViewHolder(@NonNull ViewHolder holder, int position) 
            TextView c_name, c_number;

            c_name = holder.cV_name;
            c_number = holder.cV_number;

            c_name.setText(mListContacts.get(position).getName());
            c_number.setText(mListContacts.get(position).getNumber());
        

        @Override
        public int getItemCount() 
            return mListContacts.size();
        

        public class ViewHolder extends RecyclerView.ViewHolder
            TextView cV_name, cV_number;
            AppCompatImageButton messageButton;

            private LinearLayout item_contact;

            public ViewHolder(View itemView)
                super(itemView);

                cV_name = itemView.findViewById(R.id.name_contact);
                cV_number = itemView.findViewById(R.id.phone_contact );
                messageButton = itemView.findViewById(R.id.message_button);

                item_contact = (LinearLayout) itemView.findViewById(R.id.contact_item_id);

            
        
    

您在/**..*//**..*/ 之间看到一些代码,我只是尝试隔离获取名称和数字值的方法,并使用它们从MessageToContact_Activity 设置标题和副标题>。 以下是 MessageToContact_Activity 的实现:


    public class MessageToContact_Activity extends AppCompatActivity
        private String name, number;

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

            Toolbar toolbar = findViewById(R.id.messageToolbar);
            setSupportActionBar(toolbar);

            getSupportActionBar().setDisplayShowHomeEnabled(true);
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);

            /*************************/
            getSupportActionBar().setTitle(getName());
            getSupportActionBar().setSubtitle(getNumber());
            /*************************/
        
        /*************************/
        public MessageToContact_Activity()

        public String getName() 
            return name;
        

        public String getNumber() 
            return number;
        

        public void setName(String name) 
            this.name = name;
        

        public void setNumber(String number) 
            this.number = number;
        
        /*************************/
        @Override
        public boolean onOptionsItemSelected(@NonNull MenuItem item) 

            if(item.getItemId() == android.R.id.home)
                finish();
            
            return super.onOptionsItemSelected(item);
        
    

以下是联系人的项目:


    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="vertical"
        android:layout_marginLeft="16dp">

        <TextView
            android:layout_
            android:layout_
            android:textStyle="bold"
            android:text="Contact Name"
            android:id="@+id/name_contact" />

        <TextView
            android:layout_
            android:layout_
            android:text="Phone Number"
            android:id="@+id/phone_contact"/>
    </LinearLayout>

Here is the output when I use getSupportActionBar().setTitle(getName()); and getSupportActionBar().setSubtitle(getNumber());

Here is the output when I use getSupportActionBar().setTitle("Name"); and getSupportActionBar().setSubtitle("Number");

我会非常感谢任何可以帮助我的人。我有一种预感,解决方案并不难,但我仍然不知道。如果我的代码有问题,请原谅我,但我仍处于 android 应用程序开发的起步阶段。

【问题讨论】:

toolbar.setTitle, toolbar.setSubtitle?也不清楚您遇到了什么问题,您链接的第二张图片似乎有正确的结果。 是的,抱歉含糊不清。问题是当我使用getSupportActionBar().setTitle(getName());getSupportActionBar().setSubtitle(getNumber()); 时,工具栏标题和副标题中的输出应该是我选择的联系人姓名和号码。当我使用getSupportActionBar().setTitle("Name");getSupportActionBar().setSubtitle("Number"); 时,我只是为了说明输出的外观而进行了测试,但"Name""Number" 应该是实际联系人的姓名和号码。我希望这更清楚。 【参考方案1】:

Activity 不是使用new MyActivity() 创建的,而是需要使用 Intent 启动,如:

Intent i = new Intent(this, MyActivity.class);
startActivity(i);

如果您需要将一些参数传递给您的新活动,请将它们添加到您的意图中作为extras,如下所示:

Intent i = new Intent(this, MyActivity.class);
i.putExtra("name", "Bob");
i.putExtra("number", "12345");
startActivity(i);

因此,在您的情况下,您需要将 onClick 方法替换为以下内容:

@Override
public void onClick(View view) 
    String name = mListContacts.get(viewHolder.getAdapterPosition()).getName();
    String number = mListContacts.get(viewHolder.getAdapterPosition()).getNumber();

    Intent myIntent = new Intent(v.getContext(), MessageToContact_Activity.class);
    myIntent.putExtra("name", name);
    myIntent.putExtra("number", number);
    mContext.startActivity(myIntent);

然后在您的MessageToContact_Activity 中,您可以通过以下方式访问这些额外内容:

Bundle extras = getIntent().getExtras();
String name = extras.getString("name");
String number = extras.getString("number");

【讨论】:

是的..我忘记了关于 Intent 的那个。好的,我现在明白了。非常感谢您的解释和解决方案。再次感谢您和 Nicolas 的宝贵时间。祝你们有美好的一天! 我还在mContext.startActivities(new Intent[]myIntent);中添加了new Intent[]

以上是关于将联系人的姓名和号码设置为工具栏的标题和副标题的主要内容,如果未能解决你的问题,请参考以下文章

从电话联系人中获取姓名、电话号码和电子邮件地址[关闭]

如何从联系人列表中获取电子邮件 ID、姓名和号码

我怎样才能获得 Viber 联系人(姓名和号码)?

以编程方式更新android中的联系人姓名和号码

android获取联系人图片、姓名和手机号码

如何按姓名和电话号码搜索联系人?