آموزش برنامه نویسی اندروید با اندروید استودیو (بخش پنجاه و سوم: Context Menu )

استاندارد

در این بخش از برنامه نویسی اندروید، می خواهیم با ContextMenu ها آشنا شده و نحوه کار کردن با آن ها را آموزش دهیم.

ContextMenu در سیستم عامل ویندوز و … هم وجود دارد. بدین صورت که وقتی بر روی فایلی کلیک می کنید، می توانید با کلیک راست بر روی آن کارهایی که می توانید بر روی فایل انجام دهید را ببینید.

ولی در اندروید این کار با استفاده از نگه داشتن طولانی مدت (Hold) بر روی فایل انجام می شود.

در بخش سی ام، با لیست ویو ها و نحوه کار با آن ها آشنا شدیم.

در این بخش، با استفاده از Context Menu می خواهیم ، عملیاتی را بر روی لیست ویو (ListView) ها انجام دهیم.

مثلا این که بتوانیم نام مخاطبینی را در لیست ویو قرار بدهیم، و عملیاتی نظیر تماس و ارسال پیام را برای این لیست ویو انجام دهیم.

پس کاری که در این بخش نیز انجام می دهیم اینست که با نگه داشتن طولانی بر روی نام یکی از افرادی که در لیست ویو تعریف می کنیم، بتوانیم عملیات تماس و ارسال پیام را برای وی مشاهده نماییم.

من یک پروژه در اندروید استودیو ایجاد می کنم و نامش را ContextMenu-Gsm می گذارم.

ابتدا به سراغ Layout برنامه می رویم و یک لیست ویو را به لایه اپلیکیشن، اضافه می کنیم.

کد لیست ویو من :

<ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/listview"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="23dp" />

 

خط “android:id=”@+id/listview را به صورت دستی اضافه نمودم.

در قسمت بعدی باید در MainActivity.java ، کدهای جاوای لازم را برای لیست ویو بنویسیم.

همچنین Context Menu نیز در این بخش توضیح داده می شود.

در متد ()onCreate لیست ویو را تعریف کرده و با استفاده از آداپتر ، مقدارهایی که با استفاده از آرایه رشته ای به آن دادیم، را به لیست ویو اضافه می کنیم.

ListView listView;
String myContacts[]={"Iliya","kurosh","Arya","Mehrdad","Behnam"};
listView=(ListView)findViewById(R.id.listview);
ArrayAdapter<String> adapter=new  ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,myContacts);
listView.setAdapter(adapter);

تمام مراحل بالا در بخش سی ام توضیح داده شد. ولی یک کد در انتهای متد ()onCreate به این بخش اضافه شده است.

این کد عبارت است از :

registerForContextMenu(listView);

در این کد که listView ما به صورت آرگومان ورودی آن ، قرار گرفته است، ما لیست ویویی که نوشتیم را برای عملیات Context Menu که بعدا تعریف میکنیم آماده می کنیم.

در خارج از متد ()onCreate یک متد به نام onCreateContextMenu تعریف کرده و در آن کدهایی می نویسیم تا در هنگامی که Context Menu باز شود، مقادیری که می خواهیم به ما نشان داده شود.

public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)
    {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.setHeaderTitle("انتخاب عملیات");
        menu.add(0, v.getId(), 0, "تماس");
        menu.add(0, v.getId(), 0, "پیامک");
    }

مثلا در کد بالا ، Context Menu ما، عنوانی به نام “انتخاب عملیات” دارد.

همچنین دو عملیات “تماس” و “پیامک” را نیز برای Context Menu در این بخش تعریف می کنیم.

در مرحله بعد متدی از نوع boolean به نام onContextItemSelected تعریف می کنیم تا وقتی بر روی عملیات مربوطه مثلا تماس کلیک کردیم، کارهایی که می خواهیم را برای ما انجام دهید.

public boolean onContextItemSelected(MenuItem item){
        if(item.getTitle()=="تماس"){
            Toast.makeText(getApplicationContext(),"You Can Define Calling Code Later",Toast.LENGTH_LONG).show();
        }
        else if(item.getTitle()=="پیامک"){
            Toast.makeText(getApplicationContext(),"You Can Define Sending Sms Code Later",Toast.LENGTH_LONG).show();
        }else{
            return false;
        }
        return true;
    }

همان طور که در کد بالا مشاهده می کنید، با استفاده از دستورات کنترلی If ، عملیاتی که می خواهیم را نوشته ایم.

مثلا اگر در کد بالا بر روی تماس کلیک شود، با استفاده از کد زیر عملیات مربوط به تماس ، انجام می شود که در اینجا با استفاده از Toast این موضوع به اطلاع کاربر می رسد.

if(item.getTitle()=="تماس")

کد MainActivity.java

package com.gsm_developers.contextmenu_gsm;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

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

        ListView listView;
        String myContacts[]={"Iliya","kurosh","Arya","Mehrdad","Behnam"};
        listView=(ListView)findViewById(R.id.listview);
        ArrayAdapter<String> adapter=new  ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,myContacts);
        listView.setAdapter(adapter);

        registerForContextMenu(listView);
    }

    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)
    {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.setHeaderTitle("انتخاب عملیات");
        menu.add(0, v.getId(), 0, "تماس");
        menu.add(0, v.getId(), 0, "پیامک");
    }
    public boolean onContextItemSelected(MenuItem item){
        if(item.getTitle()=="تماس"){
            Toast.makeText(getApplicationContext(),"You Can Define Calling Code Later",Toast.LENGTH_LONG).show();
        }
        else if(item.getTitle()=="پیامک"){
            Toast.makeText(getApplicationContext(),"You Can Define Sending Sms Code Later",Toast.LENGTH_LONG).show();
        }else{
            return false;
        }
        return true;
    }

}

پروژه را Run می کنیم.

مشاهده می کنید که لیست ویو ما همان مواردی که به  آن اضافه نمودیم را نشان می دهد.

با نگه داشتن طولانی بر روی یکی از این آیتم ها ، Context Menu به ما نشان داده می شود.

اگر بر روی تماس بزنیم، عملیات مربوط به تماس به ما نشان داده می شود:

دانلود سورس کد برنامه اندروید Itemهای گرافیکی با دو مشخصه در ListView

استاندارد

در جلسه سی ام از آموزش های اندروید، به مبحث ListView پرداختیم. ListView گروهی از آیتم هایی است که به صورت ScrollBar آموزش داده می شود.

همچنین افزودن آیتم به لیست ویو نیز در بخش سی، آموزش داده شد.

اقلامی که در ListView وجود دارند، یا به صورت پیش فرض توسط برنامه نویس اضافه می شوند. یا ListView این اقلام را از دیتابیس می گیرد.

در این بخش، یک سورس ساده اپلیکیشن اندرویدی، که افزدون آیتم ها به لیست ویو را انجام میدهد برای شما آورده شده است.

استفاده از دو مقدار Name و Address برای یک آیتم و همچنین گرافیکی کردن آیتم ها از مزایای این سورس کد ساده است.

در این اپلیکیشن، اضافه کردن و تبدیل نمودن آیتم به لیست ویو با استفاده از adapter انجام می شود.

این گونه برنامه ها می تواند برای کسانی که در سطح متوسطی از توسعه اپلیکیشن های اندرویدی قرار دارند بسیار مفید باشد.

شما می توانید توسط لینک زیر، این سورس کد را دانلود نمایید:

آموزش برنامه نویسی اندروید با اندروید استودیو (بخش سی: کار با لیست ویو (ListView) در اندروید)

استاندارد

در بخش قبل، دیدیم که می توانیم آیتم هایی را به صورت کشویی در یک جا وارد نماییم. کشویی بودن ابزار Spinner به ما این امکان را می داد که با کلیک بر روی آن، لیستی که حاوی آیتم های وارد شده توسط ما است به کاربر نمایش داده شود تا بتواند انتخاب کند.  حال اگر بخواهیم این آیتم ها به صورتی عمودی و نه کشویی در اپلیکیشن ما وارد شده باشند چه کار کنیم؟

جواب استفاده از ListView در برنامه نویسی اندروید است.

اقلامی که در ListView وجود دارند، یا به صورت پیش فرض توسط برنامه نویس اضافه می شوند. یا ListView این اقلام را از دیتابیس می گیرد.

در این بخش سعی شده است با مثالی نحوه افزودن مقادیر به یک لیست ویو آموزش داده شود.

مقدار دهی به لیست ویو کار سختی نیست. اگر بخش قبل را مشاهده کرده باشید خواهید دید که برای اضافه کردن مقادیر به لیست ویو، تفاوت چندانی بین یک لیست ویو و لیست کشویی وجود ندارد.

در اینجا یک پروژه به نام ListView-Gsm ایجاد کرده ام. از قسمت Paletteها و در Containers، یک ابزار ListView را انتخاب می کنیم و به لایه اپلیکیشن خود، می کشیم.

کد ListView

<ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

اگر کد شما هم مثل کد من ID ندارد می توانید با اضافه کردن کد زیر به آن آیدی دلخواه خودتان را بدهید. من در اینجا از آیدی listview استفاده نموده ام.

android:id="@+id/listview"

نکته: به جای “listview” می توانید مقداری که خودتان می خواهید را به عنوان ID انتخاب نمایید.

حال به قسمت جاوای برنامه می رویم تا کدهای مربوط به آن را بنویسیم. فایل MainActivity.java را باز می کنیم و مثل بخش قبل، کدهای زیر را در آن می نویسیم.

ابتدا این کدها به صورت بخش بخش برای شما شرح می دهیم.

اول یک متغیر از نوع رشته String معرفی کرده و به آن مقدار می دهیم. این مقادیر باید همان مقادیری باشند که ما می خواهیم لیست ویو ما آن ها را نشان بدهد.

من از متغیر Month در اینجا استفاده کردم و به آن مقادیر ماههای مهر تا اسفند را دادم:

String[] Month = {"Mehr" , "Aban" , "Azar" , "Day" , "Bahman" ,  "Esfand"};

در مرحله بعدی، یک ArrayAdapter به رشته (string) اضافه نماییم. این کار باعث می شود که اطلاعات از رشته ای که تعریف کرده بودیم گرفته شود و سپس به صورت لیست شده به لیست ویو ما فرستاده شود.

این کد داخل تابع ()onCreate نوشته می شود.

ArrayAdapter adapter = new ArrayAdapter<String>(this,R.layout.activity_listview, Month);

سپس لیست ویو خود را با استفاده از آیدی آن به برنامه معرفی می کنیم.

این کد نیز در داخل تابع ()onCreate نوشته می شود.

ListView listView = (ListView) findViewById(R.id.listview);

در آخر نیز با استفاده از آداپتری که قبلا معرفی کرده بودیم، اطلاعات را به لیست ویو می دهیم.

این اطلاعات همان ماههای مهر تا اسفند هستند که به صورتی تنظیم شده اند که با استفاده از آداپتر لیست ویو آن ها را بشناسد.

این کد نیز در داخل تابع ()onCreate نوشته می شود.

listView.setAdapter(adapter);

کد کامل MainActivity

package com.gsm_developers.listview_gsm;

import android.app.ListActivity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends AppCompatActivity {

    String[] Month = {"Mehr" , "Aban" , "Azar" , "Day" , "Bahman" ,  "Esfand"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ArrayAdapter adapter = new ArrayAdapter<String>(this,R.layout.activity_listview, Month);
        ListView listView = (ListView) findViewById(R.id.listview);
        listView.setAdapter(adapter);

    }
}

در این خط از تابع Errorی را مشاهده می کنید.

ArrayAdapter adapter = new ArrayAdapter<String>(this,R.layout.activity_listview, Month);

این ارور در قسمت R.layout.activity_listview می باشد. و اگر Alt + Enter را هم برای این ارور بزنیم، هیچ کلاسی را نمی تواند Import نماید.

این ارور به این دلیل است که در Layout برنامه، تعریفی برای لیست ویو نداشته ایم.

راه حل چیست؟

به قسمت Res و سپس Layout بروید.

بر روی Layout کلیک راست نمایید و از قسمت New، با زدن Layout resource file می توانید یک Layout جدید را علاوه بر activity_main.xml اضافه نمایید.

در پنجره ی باز شده ما فقط نام activity_listview را برای Layout خود، وارد می کنیم.

مشاهده می کنید که Layout جدید به برنامه افزوده شده است.

حال باید به این Layout، یک کد برای کاری که می خواهیم انجام دهیم وارد نماییم. تا قسمت جاوای برنامه بتواند لیست ویو را شناسایی کند و اندروید استودیو، برای اجرای اپلیکیشن از این قسمت که ظاهر برنامه است برای ایجاد لیست استفاده می کند.

به سراغ فایل activity_listview.xml می رویم و کد زیر را وارد می کنیم:

<?xml version="1.0" encoding="utf-8"?>
<!--  Single List Item Design -->

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/label"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dip"
    android:textSize="16dip"
    android:textStyle="bold" >
</TextView>

عکس فایل activity_listview.xml من به همراه کدهای آن را در زیر مشاهده می کنید.

حال کد جاوای برنامه ظاهر لیست ویو را با استفاده از فایلی که ما به آن شناساندیم، شناسایی کرده است. و برنامه آماده اجرا می باشد.

برنامه را اجرا کرده و خروجی زیر را مشاهده می کنیم:

لازم به ذکر است که با تغییر کدی که برای فایل activity_listview در قسمت قبل، معرفی کردیم، می توانید لیست ویو خود را به صورت های دیگری نیز مشاهده کنید.

مثلا با تغییر مقدار textSize ، سایز نوشته های درون لیست ویو تغییر خواهد کرد.