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

استاندارد

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

برای ساخت چنین ویژگی، باید از TextWatcher استفاده نمایید.

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

 

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

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

من یک پروژه به نام TextWatcher-Gsm در اندروید استودیو ایجاد می کنم. در ابتدا به سراغ لایه اپلیکیشن یا همان activity_main.xml می روم.

سپس از قسمت ابزارها (Paletteها)، یک LinearLayout به لایه اپلیکیشن برنامه اضافه می کنم.

در قسمت بعدی، دو TextView یکی برای نمایش کلمه Strength و دیگری برای نمایش میزان Strength به LinearLayout اضافه می کنم. کمی پایینتر از لایه LinearLayout ، یک ابزار TextPlain یا همان EditText ، نیز به لایه اصلی اپلیکیشن اضافه می کنم.

کد اصلی لایه اپلیکیشن

<?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.textwatcher_gsm.MainActivity">

    <LinearLayout
        android:id="@+id/linearLayout"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#0baff4"
        android:orientation="horizontal" >

        <TextView
            android:id="@+id/textViewPassword"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:text=" Strength : "
            android:textColor="#fff"
            android:textSize="20dp" />

        <TextView
            android:id="@+id/textViewPasswordStrength"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:text="Not Eneterd"
            android:textColor="#fff"
            android:textSize="23dp"
            android:textStyle="bold" />
    </LinearLayout>
    <EditText
        android:id="@+id/Password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/linearLayout"
        android:layout_below="@+id/linearLayout"
        android:layout_marginTop="105dp"
        android:ems="10"
        android:gravity="center_horizontal"
        android:hint="Enter Password"
        android:inputType="textPassword"
        android:maxLength="20"
        android:textSize="23dp" >

        <requestFocus />
    </EditText>
</RelativeLayout>

کارمان با لایه اصلی اپلیکیشن ، تمام شده است. به سراغ فایل MainActivity.java می رویم تا کدهای جاوای برنامه را بنویسیم.

در ابتدا TextView و EditText را به صورت Global معرفی می کنیم. یعنی در MainActivity و قبل از تابع ()onCreate .

EditText Password;
TextView PasswordStrengthIndiactor;

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

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

PasswordStrengthIndiactor = (TextView) findViewById(R.id.textViewPasswordStrength);
Password = (EditText) findViewById(R.id.Password);

در مرحله بعدی، مقدار Password را به تابع mTextEditorWatcher می فرستم تا عملیات مربوطه بر روی آن انجام شود. (این تابع را در قسمت بعدی تکمیل می کنیم)

Password.addTextChangedListener(mTextEditorWatcher);

یک تابع private final TextWatcher ایجاد می کنیم. سپس با استفاده از رویدادهای beforeTextChanged و onTextChanged ، می توانیم در زمان قبل از تغییر EditText و در هنگام تغییر EditText ، عملیات های لازم را انجام دهیم.

معرفی تابع mTextEditorWatcher :

private final TextWatcher mTextEditorWatcher = new TextWatcher() {
// کدهای بعدی اینجا نوشته می شوند
};

معرفی دو رویداد beforeTextChanged و onTextChanged :

public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            PasswordStrengthIndiactor.setText("Not Entered");
        }

public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

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

public void afterTextChanged(Editable s) {
            if (s.length() == 0)
                PasswordStrengthIndiactor.setText("Not Entered");
            else if (s.length() < 6)
                PasswordStrengthIndiactor.setText("آسان");
            else if (s.length() < 10)
                PasswordStrengthIndiactor.setText("متوسط");
            else if (s.length() < 15)
                PasswordStrengthIndiactor.setText("قوی");
            else
                PasswordStrengthIndiactor.setText("قوی تر");

            if (s.length() == 20)
                PasswordStrengthIndiactor.setText("رمز عبور به حداکثر طول رسیده است!");
        }

کد کامل MainActivity

package com.gsm_developers.textwatcher_gsm;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    EditText Password;
    TextView PasswordStrengthIndiactor;

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

        PasswordStrengthIndiactor = (TextView) findViewById(R.id.textViewPasswordStrength);
        Password = (EditText) findViewById(R.id.Password);

        Password.addTextChangedListener(mTextEditorWatcher);

    }

    private final TextWatcher mTextEditorWatcher = new TextWatcher() {

        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            PasswordStrengthIndiactor.setText("Not Entered");
        }

        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        public void afterTextChanged(Editable s) {
            if (s.length() == 0)
                PasswordStrengthIndiactor.setText("Not Entered");
            else if (s.length() < 6)
                PasswordStrengthIndiactor.setText("آسان");
            else if (s.length() < 10)
                PasswordStrengthIndiactor.setText("متوسط");
            else if (s.length() < 15)
                PasswordStrengthIndiactor.setText("قوی");
            else
                PasswordStrengthIndiactor.setText("قوی تر");

            if (s.length() == 20)
                PasswordStrengthIndiactor.setText("رمز عبور به حداکثر طول رسیده است!");
        }
    };
}

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

آموزش برنامه نویسی اندروید با اندروید استودیو (بخش سی و چهارم: کار با ویبره (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();

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

استاندارد

این بخش از آموزش اندروید استودیو، به راه اندازی ریتینگ بار (Rating Bar) در اندروید می پردازیم.

برای آن دسته از دوستانی که نمی دانند Rating Bar چیست، ابتدا توضیحاتی در این رابطه می دهیم. بعضی اوقات لازم است که در برنامه اندرویدی که طراحی نموده ایم، به قسمتی امتیاز دهی کنیم.

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

ریتینگ به معنای درجه بندی و یا رتبه بندی است.

ratingoutput1

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

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

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

از قسمت Paletteها در activity_main.xml ، یک RatingBar به لایه اپلیکیشن خود، اضافه نموده ام.

android-studio-beginners-gsm-developers_91

مشاهده می کنید که یک Rating Bar به صورت Empty به لایه اپلیکیشن، اضافه می شود.

حال یک دکمه Button نیز به لایه اپلیکیشن خود، اضافه می کنیم.

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

کد کامل Activity_main.xml

<?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.ratingbar_gsm.MainActivity">

    <RatingBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="61dp"
        android:id="@+id/ratingBar" />

    <Button
        android:text="Button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/ratingBar"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="133dp"
        android:id="@+id/button" />
</RelativeLayout>

حال به سراغ کد جاوای برنامه یا همان MainActivity.java می رویم.

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

سپس یک رشته به نام Rating معرفی کرده تا اطلاعات را از Rating Bar بگیرد و با استفاده از توست (Toast) به کاربر نشان دهد.

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

final RatingBar ratbar = (RatingBar) findViewById(R.id.ratingBar);

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

        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                String rating=String.valueOf(ratbar.getRating());

                Toast.makeText(getApplicationContext(), rating, Toast.LENGTH_LONG).show();

            }
        });

کد کامل برنامه (قسمت جاوا)

package com.gsm_developers.ratingbar_gsm;

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

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // معرفی ریتینگ بار
        final RatingBar ratbar = (RatingBar) findViewById(R.id.ratingBar);
        // معرفی دکمه
        Button button = (Button) findViewById(R.id.button);
        //  buttonمعرفی رویداد دکمه 
        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // معرفی یک رشته برای گرفتن اطلاعات از ریتینگ بار
                String rating=String.valueOf(ratbar.getRating());
                // نمایش اطلاعات رشته ای که از ریتینگ بار، اطلاعات گرفته بود به کاربر با استفاده از توست
                Toast.makeText(getApplicationContext(), rating, Toast.LENGTH_LONG).show();

            }
        });
    }
}

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

android-studio-beginners-gsm-developers_93

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