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

استاندارد

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

AutoCompleteTextView در اندروید وظیفه این کار را بر عهده دارد. AutoCompleteTextView یک نوع از جستجوی پیشرفته را ارائه می دهد که این نوع از جستجوی کلمات را انجام می دهد.

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

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

در ابتدا برای شروع، من یک پروژه به نام AutoComplete-Gsm ایجاد می کنم. سپس به قسمت لایه اپلیکیشن یعنی فایل activity_main.xml می روم. از قسمت Paletteها یک AutoCompleteTextView را به لایه اپلیکیشن Drag & Drop می کنم (می کشم) .

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

کد Xml ابزار AutoCompleteTextView :

<AutoCompleteTextView
        android:text="AutoCompleteTextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="180dp"
        android:id="@+id/autoCompleteTextView"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginLeft="20dp"
        android:layout_marginStart="64dp" />

کار ما با طراحی لایه اپلیکیشن در همین حد به اتمام می رسد. پس تنها کاری که لازم بود انجام بدیم کشیدن ابزار AutoCompleteTextView به داخل لایه اپلیکیشن بود.

حال به قسمت کد جاوای برنامه یعنی فایل MainActivity.java رفته تا کدهای جاوای اپلیکیشن را بنویسیم.

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

String[] MyDict={"Farvardin","Ordibehesht","Khordad","Tir","Mordad","Shahrivar",
                "Mehr","Aban","Azar","Dey","Bahman","Esfand",
                 "Ali","Fantasy","Emsal","Os","Kif","Saham"};

حال برای لیست کردن این رشته ها باید از یک ArrayAdapter استفاده کنیم. چون در قسمتی که می خواهیم از آرایه ی رشته ای که تعریف کرده ایم استفاده نماییم، باید اطلاعات به صورت لیست شده باشند. ArrayAdapter وظیفه لیست کردن این اطلاعات ( در اینجا ماه های سال و … که به صورت String تعریف کردیم) را برعهده دارد.

ArrayAdapter<String> adapter = new ArrayAdapter<String> (this,android.R.layout.select_dialog_item,MyDict);

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

AutoCompleteTextView actv=  (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView);

لازم به ذکر است که کلاس لایبراری زیر باید در کدجاوای برنامه Import شود تا AutoCompleteTextView بتواند در قسمت جاوای برنامه شناخته شده و مورد استفاده قرار گیرد:

import android.widget.AutoCompleteTextView;

همان طور که در کد بالا نوشتیم، نام AutoCompleteTextView در کد جاوای برنامه actv است. در قسمت بعدی از متد setThreshold برای actv استفاده می کنیم:

 

کد این قسمت:

actv.setThreshold(1);

اگر به کد بالا با دقت نگاه کنید، متوجه می شوید که در آرگومان ورودی برای متد setThreshold عدد 1 گذاشته شده است. این عدد برای اینست که به AutoCompleteTextView بگوییم تنها با اولین حرفی که وارد کرده ایم شروع به جستجو کن.  در صورتی که عدد 2 را وارد کنیم، پس از وارد کردن دو حرف اول کلمه، برنامه شروع به جستجوی کلمات پیشنهادی می کند.

حال باید رشته ای که به صورت لیست شده با استفاده از ArrayAdapter انجام دادیم را به actv یعنی همان AutoCompleteTextView معرفی کنیم:

actv.setAdapter(adapter);

در آخر نیز می توانید رنگی را برای نمایش نوشته ی ورودی خودتان در اتوکامپلیت تکست ویو نیز مشخص نمایید:

actv.setTextColor(Color.RED);

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

دقت کنید که تنها با وارد کردن حرف a ، کلمات پیشنهادی که با حرف a شروع می شوند به شما نمایش داده می شود.

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

آموزش برنامه نویسی اندروید با اندروید استودیو (بخش چهل و یکم: تفاوت بین دو حالت LinearLayout و RelativeLayout برای نمایش فایل xml متناظر با activity ها)

استاندارد

زمانی که برای یک activity ، یک فایل xml متناظر می سازیم، معمولا نوع نمایش عناصر فایل xml متناظر آن، به صورت یکی از دو حالت LinearLayout و RelativeLayout می باشد. تفاوت این دو نوع نمایش، در نحوه قرارگیری ابزارهای مختلف در کنار یکدیگر می باشد.

برای مثال اگر ما یک دکمه Button و یک TextView داشته باشیم، اگر از حالت LinearLayout استفاده کنیم، این دو ابزار دقیقا در کنار هم چیده می شوند. ولی اگر از حالت RelativeLayout استفاده کنیم، این دو ابزار بر روی همدیگر قرار می گیرند!

یک پروژه جدید به نام Layout-Gsm ایجاد می کنم.

اگر فایل activity_main.xml را در بخش Res -> Layout انتخاب نماییم (قسمت Text) ، کدهای زیر را در ابتدا مشاهده می کنیم.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.gsm_developers.layout_gsm.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />
</RelativeLayout>

به تگ RelativeLayout (یک تگ شروع و یک تگ پایان) دقت کنید. این تگ است که مشخص کرده است که نوع نمایش فایل xml به صورت RelativeLayout باشد. بنابراین اگر بخواهیم که نوع نمایش، به صورت LinearLayout باشد، باید دو عبارت RelativeLayout را به LinearLayout تبدیل کنیم، یعنی کدها باید به صورت زیر تغییر داده شوند :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.gsm_developers.layout_gsm.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />
</LinearLayout>

حالت LinearLayout

همان طور که قبلا گفته شد وقتی حالت نمایش فایل Xml به صورت LinearLayout باشد، ابزار ها به ترتیب در کنار هم چیده می شوند و بر روی هم قرار نمی گیرند. برای درک بهتر این موضوع، دو دکمه Button را هم به لایه اپلیکیشن می کشیم.

وقتی به قسمت Design فایل activity_main.xml می رویم، همان طور که در تصویر بالا مشاهده می کنید، عناصر به صورت مرتب و در یک ردیف افقی در کنار هم قرار می گیرند.

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

 

در این تصویر، با کلیک بر روی این گزینه، ابزارها به صورتی عمودی چیده شدند.

لازم به ذکر است که این گزینه فقط برای حالت LinearLayout فعال است.

حالت RelativeLayout

حال دوباره به قسمت Text فایل activity_main.xml می رویم. و تگ Xml آن را به RelativeLayout تغییر می دهیم. به قسمت Design می رویم و مشاهده می کنید که ابزارها بر روی همدیگر افتاده اند.

می توانید مکان ابزارها را با ماوس، تغییر دهید. ولی در حالت LinearLayout این مورد امکان پذیر نبود.

اگر به قسمت Text فایل activity_main.xml بروید، مشاهده می کنید که مثلا در ابزار Button کد زیر وجود دارد:

android:layout_below="@+id/textView2"

این کد حاکی از آنست که این عنصر، زیر عنصری با آیدی textView2 قرار دارد. پس اگر دیدید که با جابه جایی ابزاری، ابزار دیگری نیز جابه جا شد، با حذف اینچنین کدهایی می توانید این قسمت را غیرفعال نمایید.

اگر گزینه ای که در زیر با فلش مشخص شده است را بزنید، مقدار layout_width ابزاری که انتخاب کرده ایم، از wrap_content به match_parent تغییر می کند.

بدیهی است که گزینه کناری آن نیز این تغییر را برای Layout_height به وجود می آورد.

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

استاندارد

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

Seekbar کاربرد های مختلفی از جمله تغییر اندازه بلندی صدا، تغییر تغییر سایز فونت، تغییر اندازه تصویر، تغییر قیمت و … را به ما می دهد که به واسطه گرافیکی بودن آن، برنامه ما می تواند کاربری دلچسب تری را داشته باشد.

من یک پروژه به نام Seekbar-Gsm ایجاد می کنم.

سپس در قسمت activity_main.xml به سراغ Paletteها یا همان جعبه ابزار می روم.

یک Seekbar و یک TextView از قسمت Widgetها به لایه اپلیکیشن می کشم.

کد تکست ویو و سیک بار

<TextView
        android:text="TextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="188dp"
        android:id="@+id/textView" />

<SeekBar
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="111dp"
        android:id="@+id/seekBar"
        android:layout_below="@+id/textView"
        android:layout_centerHorizontal="true" />

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

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

در مرحله اول در داخل تابع ()onCreate ، سیک بار و تکست ویو را با استفاده از دستور final تعریف می کنیم.

final TextView TheText=(TextView) findViewById(R.id.textView);

final SeekBar TheSeekbar=(SeekBar) findViewById(R.id.seekBar);

نکته اضافی :

کتابخانه لازم برای Seekbar، با استفاده از دستور زیر Import می شود.

import android.widget.SeekBar;

به یاد دارید که برای دکمه (Button) ها یک رویداد Listener معرفی می کردیم تا در هنگامی که بر روی دکمه میزنیم، رفتاری که می خواهیم را از خود نشان دهد. در اینجا نیز باید یک رویداد Listener برای سیک بار معرفی کنیم تا در هنگامی که مقدار آن را تغییر می دهیم فونت تکست ویو ما تغییر کند.

بدین منظور از رویداد SeekBarChangeListener، استفاده می کنیم.

TheSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

//کد ما
    }

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

 

بر روی چراغ قرمز رنگی که علامت تعجب بر روی آنست کلیک می کنیم تا علت خطا را جویا شویم.

 

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

onStartTrackingTouch یک رویداد شروع برای لمس سیک بار است.

onStopTrackingTouch یک رویداد توقف برای لمس سیک بار است.

onProgressChanged نیز یک رویداد برای زمانی که نوار سیک بار را تغییر می دهیم است.

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

بر روی Ok کلیک می کنیم تا متدهای بالا برای ما ایجاد شود.

 

 

سه متد تابع setOnSeekBarChangeListener

TheSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        }

        );

ابتدا در داخل تابع setOnSeekBarChangeListener یک متغیر عددی برای سایز فونت معرفی می کنیم.

int fontSize=0;

در داخل متد onProgressChanged ، مقدار fontsize از Progress نوار سیک بار خوانده می شود. Progress نوار سیک بار ما، مقداری را به صورت int از نوار سیک بار میگیرد. در خط اول به برنامه می گوییم که مقدار نوار سیک بار را به داخل متغیر fontsize بریزد.

دستور دوم کاملا اختیاری بوده و یک توست است که برای نمایش سایز فونت در هنگامی که سیک بار را تغییر می دهیم می باشد.

با استفاده از دستور سوم کد زیر، به تکست ویو ما ست می شود.

fontSize=progress;

Toast.makeText(MainActivity.this, "سایز فونت: " +fontSize , Toast.LENGTH_LONG).show();

TheText.setTextSize(fontSize);

در ادامه باید در داخل متد onStopTrackingTouch که متد توقف ما بود،  یک شرط به سیک بار اضافه کنیم. این شرط به برنامه می گوید اگر مقدار int کوچکتر از 30 بود عملکرد ها و یا همان کد هایی که ما ازش میخواهیم را برای ما انجام بدهد.

این کدها، می تواند هر دستوری باشند. مثلا یک توست (Toast).

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

if(fontSize<30)
                {
                    fontSize=30;

                    TheSeekbar.setProgress(fontSize);
                }

کد کامل جاوا MainActivity

package com.gsm_developers.seekbar_gsm;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

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

        final TextView TheText=(TextView) findViewById(R.id.textView);

        final SeekBar TheSeekbar=(SeekBar) findViewById(R.id.seekBar);

        TheSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

            int fontSize=0;

            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

                fontSize=progress;

                Toast.makeText(MainActivity.this, "سایز فونت: " +fontSize , Toast.LENGTH_LONG).show();

                TheText.setTextSize(fontSize);
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

                if(fontSize<30)
                {
                    fontSize=30;

                    TheSeekbar.setProgress(fontSize);
                }
            }
        }

        );
    }
}

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

البته اگر در سیک بار شما مشکل و ناهمگونی مقداری وجود داشت، به دلیل ناهمگونی ، پیشنهاد می شود دستور داخل متد onStopTrackingTouch که در اینجا بیشتر جنبه آموزشی داشت پاک شود. همچنین دستور Toast داخل متد onProgressChanged نیز ، به دلیل تاخیر چند ثانیه ای برای نمایش عدد فونت سایز، بهتر است که پاک شود.

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

استاندارد

بعضی اوقات پیش می آید که بخواهیم در قسمتی از برنامه ای که میسازیم، نمایش ویدیو داشته باشیم. برای این منظور قسمتی از لایه برنامه را به محل پخش ویدیو اختصاص می دهیم.

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

من یک پروژه جدید ایجاد می کنم و اسم آن را VideoView-Gsm میذارم.

سپس به activity_main.xml رفته و از Paletteها و در قسمت Images & Media یک ابزار VideoView را بر روی لایه اپلیکیشن خودم می کشم.

در قسمت Properties از ابزار VideoView که به لایه اپلیکیشن کشیدیم، مقدار layout_width را fill_parent می گذاریم تا عرض صفحه را بپوشاند. مقدار layout_height را نیز، wrap_content میگذاریم تا VideoView ارتفاع خودش را با فایل ویدیویی ما هماهنگ کند.

کد VideoView

<VideoView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/videoView"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="60dp" />

به سراغ کدنویسی جاوای برنامه می رویم. فایل MainActivity.xml را باز کرده و طبق مراحل زیر پیش می رویم.

در این قسمت، فایل ویدیویی که می خواهیم پخش شود را در یکی پوشه های پروژه برنامه می ریزیم. برای این کار باید فایل ویدیویی را در پوشه Raw کپی کنیم. در قسمت پخش صوت، از آموزش های اندروید چگونگی آن توضیح داده شد ولی برای راحتی شما، در اینجا نیز همان توضیحات را می دهیم. (مراحل زیر) :

قبلا گفته شد که پوشه Res پوشه منابع ما است و عکس ها و فایل های ما برای استفاده در برنامه در این پوشه قرار می گیرد. پس باید یک پوشه جدید به نام Raw در پوشه Res ایجاد کنیم.

برای این کار طبق عکس، بر روی پوشه Res کلیک راست کرده و سپس از قسمت New، بر روی Android Resource Directory کلیک می کنیم.

android-studio-beginners-gsm-developers_86

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

android-studio-beginners-gsm-developers_87

می بینید که پوشه raw در دایرکتوری Res ایجاد شده است.

android-studio-beginners-gsm-developers_88

برای کپی کردن فایل ویدیویی ، طبق عکس میتوانید بر روی پوشه Raw کلیک راست کنید و سپس Show in explorer را بزنید تا پوشه Raw را در explorer برای شما باز کند. سپس فایل ویدیویی خود را در این پوشه کپی کنید.

ویدیویی که من کپی کردم، نامش Myvideo.mp4 است که مشاهده می کنید در پوشه Raw اضافه شده است.

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

اگر از اینجا به بعد با نام بالا پیش بروید، با خطا مواجه می شوید. ولی چرا؟

چون که من اولین بار فایل خودم را با حروف بزرگ مثل My که در بالا نوشته بودم، نوشتم. پس در برنامه نویسی اندروید فایل ها در منابع نباید با حروف بزرگ باشند.

در بخش منابع آموزش های اندروید نیز به این نکته اشاره شد.

اسم فایل را به myvideo.mp4 تغییر میدهم.

ابزار VideoView را که در بخش لایه اپلیکیشن، اضافه کرده بودیم در این قسمت معرفی می کنیم. و نام متغیر آن را Video می گذاریم.

VideoView Video = (VideoView) findViewById(R.id.videoView);

برای ابزار VideoView باید کلاس VideoView به برنامه، Import شود:

import android.widget.VideoView;

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

در این جا زیاد لازم نیست وارد این جزئیات شویم، این توضیحات فقط برای این بود که بگوییم ما در این پروژه، به یک رشته احتیاج داریم تا کار بافر را برای ما انجام دهد و ویدیوی ما در آن رشته ذخیره شود. و سپس از همان رشته، VideoView ویدیوی ما را پخش کند.

 متغیر Buffer را از نوع String معرفی می کنیم. برای این کار، کد زیر را می نویسیم:

String Buffer = "android.resource://com.gsm_developers.videoview_gsm/"+R.raw.myvideo;

توجه داشته باشید در کد بالا مقدار android.resource، در واقع محل فایل ویدیویی ما است. که اول این آدرس، نام پکیج و سپس محل قرار گیری فایل ویدیویی ما در پروژه می باشد.

“android.resource:// نام پکیج /”R.محل فایل ما در پروژه

در اینجا نام پکیج، com.gsm_developers.videoview_gsm می باشد. (نام پکیج را می توانید در اولین خط از فایل جاوا MainActivity.java مشاهده نمایید.)

محل فایل ما نیز در پوشه Raw و اسم آن myvideo است. که می شود: R.raw.myvideo

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

Uri uri = Uri.parse(Buffer);

حال باید Uri ما که در مرحله قبل آن را معرفی کردیم، توسط VideoURI ست شود.

Video.setVideoURI(uri);

کد زیر نیز، ویدیو شما را پخش می کند.

Video.start();

کد کامل MainActivity

package com.gsm_developers.videoview_gsm;

import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.VideoView;

public class MainActivity extends AppCompatActivity {

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

        VideoView Video = (VideoView) findViewById(R.id.videoView);

        String Buffer = "android.resource://com.gsm_developers.videoview_gsm/"+R.raw.myvideo;

        Uri uri = Uri.parse(Buffer);
        Video.setVideoURI(uri);
        Video.start();
    }
}

اگر اپلیکیشینی را که نوشته ایم اجرا نمایید، خروجی زیر را مشاهده می کنید.

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

استاندارد

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

در این بخش قرار است با ویبره (Vibrator) کار کنیم. نحوه پیاده سازی و کار کردن با ویبره در اندروید خیلی سخت نیست و تنها کافی ست که ویبره را در کد جاوای برنامه تعریف کنیم. ولی از آنجایی که وقتی حرف از کار سخت افزار پلتفرم اندرویدی می آید، حتما دسترسی ها هم باید مشخص و تعیین شوند. پس باید در قسمت AndroidManifest نیز مانند بخش قبل، دسترسی هایی را به برنامه اندرویدی خود بدهیم.

من یک پروژه با نام Vibrator-Gsm در اندروید استودیو خودم ایجاد می کنم. از مسیر  app -> res -> activity_main.xml به قسمت لایه اپلیکیشن رفته و در قسمت Design این لایه، از Paletteها، یک Button را به لایه اپلیکیشن می کشم. اسم این Button را Vibrate می گذارم. آیدی Button من نیز، همان Button است.

در قسمت اول، یک متغیر از نوع Button به اسم BtnVbrte ایجاد می کنم و Button موجود در لایه را به BtnVbrte نسبت می دهم.

Button BtnVbrte = (Button) findViewById(R.id.button);

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

رویداد Listener برای متغیر BtnVbrte توسط دستور زیر تعریف می شود:

BtnVbrte.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

      // کد شما                

            }
        });

در مرحله بعد در داخل Listener دکمه Button ما، یک متغیر به نام دلخواه (در اینجا Vib) از نوع Vibrator معرفی می کنم. این متغیر در واقع از سرویس کلاس Vibrate استفاده می کند.

Vibrator Vib = (Vibrator) getSystemService(MainActivity.VIBRATOR_SERVICE);

سپس مدت زمان ویبره را نیز با استفاده از دستور زیر مشخص می کنیم. ( در اینجا 2 ثانیه = 2000 میلی ثانیه)

long milliseconds = 2000;

Vib.vibrate(milliseconds);

کد کامل MainActivity

package com.gsm_developers.vibrator_gsm;

import android.os.Vibrator;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

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

        Button BtnVbrte = (Button) findViewById(R.id.button);

        BtnVbrte.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                Vibrator Vib = (Vibrator) getSystemService(MainActivity.VIBRATOR_SERVICE);

                long milliseconds = 2000;

                Vib.vibrate(milliseconds);

            }
        });
    }
}

برای دادن دسترسی ویبره به برنامه، باید به قسمت AndroidManifests.xml رفته (مسیر app -> Manifests -> AndroidManifest.xml) و سپس کد زیر را در آنجا قبل از تگ application> نوشت.

<uses-permission android:name="android.permission.VIBRATE"/>

کد کامل AndroidManifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.gsm_developers.vibrator_gsm">
    <uses-permission android:name="android.permission.VIBRATE"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

با زدن دکمه Button که در اپلیکیشن ما Vibrate نام دارد، عمل ویبره انجام می شود.

البته پیغام من جهت تست بوده چون در دستگاه شبیه ساز، انجام شده و ویبره ای به صورت عملی نمیتوانستم مشاهده کنم. و کد آن در زیر آمده تا پس از اجرای دستور ویبره، این دستور اجرا شود.

Toast.makeText(MainActivity.this, "عمل ویبره انجام شد", Toast.LENGTH_LONG).show();