آموزش برنامه نویسی اندروید با اندروید استودیو (بخش پنجاه و سوم: 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 به ما نشان داده می شود.

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

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

استاندارد

با ClickListener در بخش های ابتدایی آشنا شدیم. نحوه کار با آن با Button ها را در جلسه یازدهم آموختیم.

کار ClickListener اینست که قابلیتی به ابزارها مثلا دکمه Button می دهد که همواره به کلیک کردن کاربر گوش کنند.

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

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

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

ولی OnLongClickListener چیست؟

با دقت به کلمه Long می توان حدس هایی زد. در واقع در این جا باید دکمه و یا به طور کلی ابزار ما که با OnLongClickListener تعریف شده است، را برای مدتی نگه (Hold) داشت تا رویداد مورد نظر فعال شود.

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

در ادامه با ما همراه باشید تا نحوه کار با OnLongClick را با استفاده از پروژه ای بیاموزید.

من یک پروژه به نام OnLongClick-GSM ایجاد می کنم.

سپس به قسمت لایه اپلیکیشن (activity_main.xml) و ابزار اندروید استودیو (Palette) می روم. و یک Button بر روی لایه اضافه می کنم.

در مرحله بعد به قسمت کد جاوای برنامه (MainActivity) می روم تا کدهای مورد نظر را بنویسم.

دقت داشته باشید که این مرحله بسیار شبیه به همان ClickListener معمولی ست.

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

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

حال رویدادی به صورت OnLongClickListener برای دکمه Button تعریف می کنم.

BTN.setOnLongClickListener(new Button.OnLongClickListener(){

// کدهای این رویداد
   });

می توانیم برای تست عملکرد OnLongClickListener کدهای زیر را در داخل این رویداد بنویسیم:

@Override
            public boolean onLongClick(View arg0) {
                Toast.makeText(MainActivity.this, "کلیک انجام شد", Toast.LENGTH_SHORT).show();
                return false;
            }

کل کدهای که در متد ()onCreate ایجاد کردیم را می توانید در زیر مشاهده کنید :

Button BTN = (Button) findViewById(R.id.button);
        BTN.setOnLongClickListener(new Button.OnLongClickListener(){

            @Override
            public boolean onLongClick(View arg0) {
                Toast.makeText(MainActivity.this, "کلیک انجام شد", Toast.LENGTH_SHORT).show();
                return false;
            }

        });

کد کلاس MainActivity.java به همراه کلاس ها و کتابخانه های import شده:

package com.gsm_developers.onlongclick_gsm;

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

public class MainActivity extends AppCompatActivity {

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

        Button BTN = (Button) findViewById(R.id.button);
        BTN.setOnLongClickListener(new Button.OnLongClickListener(){

            @Override
            public boolean onLongClick(View arg0) {
                Toast.makeText(MainActivity.this, "کلیک انجام شد", Toast.LENGTH_SHORT).show();
                return false;
            }

        });
    }
}

کار تمام است.

این اپلیکیشن را اجرا می کنیم.

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

آموزش برنامه نویسی اندروید با اندروید استودیو (بخش چهل و دوم: ساخت 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 متوسط در نظر گرفته شده است:

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

استاندارد

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

فهمیدیم که Shape در اصل به چه کاری می آید. سپس یک Button ایجاد کردیم و سعی کردیم با استفاده از Shape شکل ظاهری آن را تغییر دهیم.

همچنین برای Buttonی که نوشته بودیم، دو شکل ظاهری تعریف کردیم. که اگر بر روی Button کلیک شد، شکل ظاهری آن تغییر کند. و برای آن از Selector استفاده نمودیم.

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

ایجاد یک Button گرد

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

کار را با همان پروژه ی قبلی پیش می بریم. ولی اگر پروژه جدیدی ایجاد کرده اید کافیست به سراغ فایل activity_main.xml یا همان لایه اپلیکیشن اندرویدی بروید و یک دکمه با آیدی Button ایجاد نمایید.

برای ایجاد یک دکمه گرد، به سراغ پوشه drawable در دایرکتوری res می رویم و بر روی آن کلیک راست می کنیم.

سپس از قسمت New به Drawable resource file بروید و بر روی آن کلیک کنید.

در پنجره ای که باز می شود اسم فایل (File Name) را circlebutton ( دکمه گرد ) می گذارم. شما هر نامی دوست دارید به آن بدهید.

حال یک فایل xml به نام circlebutton برای شما در پوشه drawable ایجاد شده است.

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

بدین منظور بر روی circlebutton.xml کلیک کنید تا محتویات آن به صورت xml برای شما باز شود. مشاهده می کنید که تگی به نام selector وجود دارد. آن تگ را حذف و بنویسید shape تا تگ shape را ایجاد نمایید.

حال می توانید کد های زیر را در تگ shape بنویسید:

<stroke
        android:width="2dp"
        android:color="#4d2929" />
    <corners
        android:radius="20dp"
        />
    <solid
        android:color="#206af2"
        />

    <padding
        android:left="5dp"
        android:top="5dp"
        android:right="5dp"
        android:bottom="5dp"
        />

کد کامل circlebutton.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" >

    <stroke
        android:width="2dp"
        android:color="#4d2929" />
    <corners
        android:radius="20dp"
        />
    <solid
        android:color="#206af2"
        />

    <padding
        android:left="5dp"
        android:top="5dp"
        android:right="5dp"
        android:bottom="5dp"
        />

</shape>

همانند بخش قبلی باید به سراغ فایل activity_main.xml برویم و circlebutton.xml را به عنوان آدرس background را به دکمه بدهیم:

android:background="@drawable/circlebutton"

کد کامل دکمه Button من:

<Button
        android:text="Button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:background="@drawable/circlebutton"
        android:id="@+id/button" />

اگر به قسمت لایه اپلیکیشن یا همان activity_main.xml در قسمت Design بروید، مشاهده می کنید که شکل دکمه شما به این صورت تغییر کرده است:

آموزش کار با gradient

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

Gradient در واقع باعث می شود که دکمه شما به صورت لایه به لایه، رنگ های متفاوتی داشته باشد.

همانند قبل، به سراغ دایرکتوری drawable در res می رویم و بر روی آن کلیک راست می کنیم. سپس یک فایل xml ایجاد می کنیم.

اسم فایلی که من ایجاد کردم، shapebackground است. لازم به ذکر است که این فایل نوعی shape است و محتویات آن در زیر به شما نشان داده شده است:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <corners
        android:radius="14dp"
        />
    <gradient
        android:angle="90"
        android:centerX="35%"
        android:centerColor="#2c96de"
        android:startColor="#E8E8E8"
        android:endColor="#c64444"
        android:type="linear"
        />
    <padding
        android:left="0dp"
        android:top="0dp"
        android:right="0dp"
        android:bottom="0dp"
        />
    <size
        android:width="270dp"
        android:height="60dp"
        />
    <stroke
        android:width="3dp"
        android:color="#254458"
        />

</shape>

در مورد خاصیت های padding , stroke, corner در آموزش های قبل توضیح داده شد.در حال حاضر می خواهیم خاصیت gradient را بررسی کنیم.

همانطور که می بینید در gradient خاصیت startColor برای شروع رنگ و خاصیت EndColor برای پایان دادن به رنگ ایجاد شده است. همچنین از خاصیت angle برای زاویه ای که به رنگ شیب داده می شود استفاده شده است. که شما می توانید با تغییر دادن آن زاویه ی دلخواه را به رنگ لیوت بدهید.خاصیت type را برابر با linear قرار دادیم که به این مفهوم است که شروع شیب از کناره ها باشد.

به سراغ فایل activity_main.xml رفته و در قسمت text برای background دکمه Button کد زیر را می نویسیم: (آدرس shapebackground را به آن می دهیم)

android:background="@drawable/shapebackground"

کد کامل دکمه من:

 

<Button
        android:text="Button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:background="@drawable/shapebackground"
        android:id="@+id/button" />

خروجی نهایی به صورت زیر است:

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

استاندارد

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

در نتیجه برای افزایش سرعت و کاهش حجم برنامه ی خود باید از shape ها استفاده کنید.

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

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

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

به سراغ فایل لایه اپلیکیشن یا همان activity_main.xml می روم. یک Button را از قسمت Paletteها به لایه اپلیکیشن اندروید می کشم. می خواهیم برای این دکمه انواع ظاهر سازی ها را انجام دهیم.

باید یک فایل xml جدید در قسمت drawable بسازیم. برای این کار بر روی پوشه Drawbale کلیک راست نمایید. سپس از قسمت New به Drawable resource file بروید و بر روی آن کلیک کنید.

در پنجره ای که باز می شود، اسم فایل را myshape می گذارم و بدون هیچ تغییر دیگری بر روی Ok کلیک می کنم.

 

 

دوستانی که با اکلیپیس کار کرده اند قسمتی برای ایجاد Shape داشته اند. ولی ما به ناچار با همین روش پیش رفتیم و در درون فایلی که ایجاد شده است تغییرات را انجام می دهیم . تا فایل ما هم Shape شود!!

بدین منظور بر روی myshape کلیک کنید تا محتویات آن به صورت xml برای شما باز شود. مشاهده می کنید که تگی به نام selector وجود دارد. آن تگ را حذف و بنویسید shape تا تگ shape را ایجاد نمایید.

در داخل تگ shape، کدهای زیر را کپی کنید.

 

<corners
        android:radius="11dp"
        />
    <solid
        android:color="#DE983C"
        />
    <padding
        android:left="0dp"
        android:top="0dp"
        android:right="0dp"
        android:bottom="0dp"
        />
    <size
        android:width="270dp"
        android:height="60dp"
        />
    <stroke
        android:width="4dp"
        android:color="#32D93D"
        />

در واقع محتویات فایل myshape من به این شکل است.

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <corners
        android:radius="11dp"
        />
    <solid
        android:color="#DE983C"
        />
    <padding
        android:left="0dp"
        android:top="0dp"
        android:right="0dp"
        android:bottom="0dp"
        />
    <size
        android:width="270dp"
        android:height="60dp"
        />
    <stroke
        android:width="4dp"
        android:color="#32D93D"
        />

</shape>

توضیحات:

در قسمت اول که rectangle می باشد باعث می شود که شکا Button شما به صورت مربع باشد و گزینه های دیگری هم دارد که شما می توانید از آنها استفاده کنید.تگ Stroke یک مرزی را در دور تا دور دکمه ایجاد می کند و هر چقدر مقدار آن بیشتر باشد آن خطی که به صورت مرز دور دکمه است پهن تر می شود.corner گوشه های  دکمه را از تمامی جهت ها قوس می دهد و از آن حالت تیز بودن خارج می کند.تگ solid هم یک رنگ برای داخل دکمه در نظر می گیرد.بعد از تمامی این کارها باید فایل xml که حاوی کدهای shape است را به Button اختصاص دهید.

برای این کار، به سراغ فایل activity_main.xml رفته و در قسمت Text این فایل ( کدهای xml) ، به دکمه Button خاصیت جدیدی به نام android:background اضافه می کنیم.

android:background="@drawable/myshape"

این خاصیت، به آدرس Shape که ساخته ایم، اشاره می کند که در پوشه drawable با اسم myshape وجود دارد.

کد کامل دکمه Button من:

<Button
        android:text="Button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:background="@drawable/myshape"
        android:id="@+id/button" />

اگر به قسمت Design لایه اپلیکیشن خود، بروید؛ مشاهده می کنید که دکمه Button شما به این شکل در آمده است.

تغییر ظاهر دکمه Button در هنگام کلیک

گاهی اوقات شما می خواهید که وقتی روی یک Button کلیک می کنید ظاهر آن تغییر کرده و نمای زیبایی به باتن دهید.این کار باعث می شود که ظاهر دکمه ی شما در هنگام کلیک کردن و در هنگامی که کلیکی روی آن صورت نگرفته تفاوت داشته باشد.

در قسمت قبلی، دیدید که تگ selector را پاک کردیم و به جایش تگ shape را گذاشتیم. برای آن که وقتی بر روی دکمه کلیک می کنیم، ظاهر آن تغییر نماید، این بار باید این کار را از طریق selector انجام دهیم!

باید یک فایل xml جدید در قسمت drawable بسازیم. برای این کار بر روی پوشه Drawbale کلیک راست نمایید. سپس از قسمت New به Drawable resource file بروید و بر روی آن کلیک کنید.

در پنجره باز شده نام فایل را به myselector تغییر می دهم.

بدون ایجاد تغییرات دیگری بر روی ok کلیک می کنم تا فایل ایجاد شود.

حال کد زیر را درون تگ selector فایل myselector قرار می دهم.

<item android:state_pressed="true" android:drawable="@drawable/pressd"></item>

<item android:state_enabled="true" android:drawable="@drawable/enable"></item>

محتویات داخل فایل myselector من به این شکل است:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/pressd"></item>

    <item android:state_enabled="true" android:drawable="@drawable/enable"></item>
</selector>

در قسمت state_pressd شما آدرس آن فایل xml را که می خواهید زمانی که دکمه فشرده می شود تغییر ظاهر دهد را وارد می کنید.در واقع state_pressd مقدار trou دارد یعنی حالت pressd یا فشرده شدن آن درست است و در ادامه آدرس فایل داده می شود.در قسمت stte_enable هم که مقدار آن true می باشد آدرس فایل xml که می خواهید زمانی که هنوز روی دکمه کلیکی انجام نشده نمایش داده شود را وارد می کنید.

در کد “android:drawable=”@drawable/pressd مشکل پیش آمده است چون به رنگ قرمز در آمده است. به این علت است که فایل pressd در دایرکتوری drawable وجود ندارد. فایل pressd مشخص می کند که بر روی دکمه کلیک شده است. برای ایجاد آن دوباره یک فایل xml در پوشه drawable به نام pressd می سازیم. و محتویات آن را به صورت زیر تغییر می دهیم:

دقت کنید که این فایل نوعی shape است.

 

محتویات فایل pressd.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <corners
        android:radius="16dp"
        />
    <solid
        android:color="#FF58C728"
        />
    <padding
        android:left="0dp"
        android:top="0dp"
        android:right="0dp"
        android:bottom="0dp"
        />
    <size
        android:width="250dp"
        android:height="50dp"
        />
    <stroke
        android:width="3dp"
        android:color="#e74040"
        />

</shape>

در کد “android:drawable=”@drawable/enable نیز مشکل پیش آمده است چون به رنگ قرمز در آمده است. به همان علتی که برای فایل pressd نیز مشکل پیش آمده بود.

 برای ایجاد آن یک فایل xml در پوشه drawable به نام enable می سازیم. و محتویات آن را به صورت زیر تغییر می دهیم:

دقت کنید که این فایل نیز نوعی shape است.

محتویات فایل enable.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <corners
        android:radius="16dp"
        />
    <solid
        android:color="#284dc7"
        />
    <padding
        android:left="0dp"
        android:top="0dp"
        android:right="0dp"
        android:bottom="0dp"
        />
    <size
        android:width="250dp"
        android:height="50dp"
        />
    <stroke
        android:width="3dp"
        android:color="#b540e7"
        />

</shape>

باید آدرس فایل myselector را به دکمه Button بدهیم. برای این کار، همانند بالا به سراغ فایل activity_main.xml رفته و در قسمت Text این فایل ( کدهای xml) ، به دکمه Button خاصیت جدیدی به نام android:background اضافه می کنیم.

android:background="@drawable/myselector"

این خاصیت، به آدرس Shape که ساخته ایم، اشاره می کند که در پوشه drawable با اسم myselector وجود دارد.

کد کامل دکمه Button من:

<Button
        android:text="Button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:background="@drawable/myselector"
        android:id="@+id/button" />

از آنجایی که باید بر روی دکمه Button کلیک کنیم تا تغییرات را در آن ببینیم، برنامه را اجرا می کنیم.

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

این هم شکل دکمه Button وقتی بر روی آن کلیک می کنیم.

آموزش برنامه نویسی اندروید با اندروید استودیو (بخش سی و هشتم: طراحی لایه جدید با استفاده از Toast سفارشی)

استاندارد

در پروژه ها و آموزش های قبلی از توست (Toast) استفاده کردیم. دیدیم که Toast یک پیغام چند لحظه ای را به کاربر نشان می داد.

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

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

یک پروژه جدید به نام CustomToast-Gsm ایجاد می کنم.  حال به قسمت لایه اصلی اپلیکیشن یعنی activity_main.xml می رویم. سپس یک Button را به داخل لایه اپلیکیشن می کشیم.

وظیفه این دکمه اینست که وقتی بر روی Button کلیک شود، پیغام Toast ما نشان داده شود.

به این قسمت خوب توجه کنید. چون برای ساخت یک Toast سفارشی ، باید یک فایل xml جدید در قسمت Layout بسازیم.

برای این کار بر روی پوشه Layout کلیک راست می کنیم. سپس از قسمت New به Layout Resource File می رویم و بر روی آن می زنیم. ( مراحلی که گفته شد را می توانید در عکس مشاهده نمایید )

در پنجره ای که باز شده است، FileName و یا همان اسم فایل را mytoast (حروف کوچک) می گذاریم. Root element و Directory name باید مقدار LinearLayout و Layout را داشته باشند ( به طور پیش فرض این دو فعال هستند)

حال مشاهده می کنید که یک فایل layout جدید به نام mytoast اضافه شده است که می توان همانند activity_main.xml به این لایه نیز ابزار های مختلف را اضافه نمود.

از قسمت Paletteها یک textView به این لایه (mytoast) اضافه می کنیم. سپس یک ImageView نیز به این لایه اضافه می کنیم.

وقتی که ImageView را به داخل لایه mytoast اپلیکیشن می کشیم، از ما تصویری برای نمایش می خواهد که طبق شکل زیر این آیکون اندروید را برای آن انتخاب می کنیم.

کد کامل mytoast.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:weightSum="1">

    <TextView
        android:text="در حال بارگذاری، لطفا منتظر بمانید"
        android:id="@+id/textView"
        android:layout_height="70dp"
        android:layout_marginLeft="150dp"
        android:layout_marginTop="150dp"
        android:layout_width="120dp" />

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:srcCompat="@mipmap/ic_launcher"
        android:id="@+id/imageView" />

</LinearLayout>

پس تا به اینجا یک دکمه Button به لایه activity_main.xml اضافه کردیم. سپس یک لایه جدید به نام mytoast.xml ساختیم. و در آن لایه، یک ابزار TextView و یک ابزار ImageView اضافه نمودیم.

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

بدین منظور بر روی پوشه drawable کلیک راست می کنیم و از قسمت New به Drawable Resource File می رویم.

 

در پنجره باز شده نام فایل را Toast_border می گذاریم. و RootElement را Shape انتخاب می کنیم.

نکته:

اگر شما قادر به ساخت Shape نبودید می توانید محتویات داخل فایل toast_border.xml را به شکل زیر تغییر دهید تا به یک فایل shape تغییر داده شود.

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

</shape>

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

کد کامل toastborder.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <stroke
        android:width="4dp"
        android:color="#FFF" />

    <padding
        android:left="7dp"
        android:top="7dp"
        android:right="7dp"
        android:bottom="7dp" />

    <corners
        android:radius="10dp" />

    <solid
        android:color="#00A1E4"></solid>

</shape>

نکته: طراحی رابط کاربری در بخش بعد توضیح داده می شود.

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

private Button ClickToShowToast;

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

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

        ClickToShowToast.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                showCustomAlert();
            }
        });
    }

تابع Toast که در قسمت پایین کد جاوای ما و درون MainActivity نوشته است ، نیز بدین شرح است:

public void showCustomAlert() {

        Context context = getApplicationContext();
        LayoutInflater inflater = getLayoutInflater();

        View toastRoot = inflater.inflate(R.layout.mytoast, null);

        Toast toast = new Toast(context);

        toast.setView(toastRoot);
        toast.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL, 0, 0);
        toast.setDuration(Toast.LENGTH_LONG);
        toast.show();

    }

یک لایه با استفاده از mytoast.xml می سازد.

LayoutInflater inflater = getLayoutInflater();

سپس لایه را برای نمایش toast فراخوانی می کند.

View toastRoot = inflater.inflate(R.layout.mytoast, null);

و در آخر مقادیر لایه را به Toast جهت نمایش ست می کند.

toast.setView(toastRoot);
toast.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL, 0, 0);
toast.setDuration(Toast.LENGTH_LONG);

با استفاده از دستور setGravity یک مقدار جاذبه برای Toast در نظر گرفته ایم. با استفاده از دستور setDuration نیز یک زمان نمایش برای Toast در نظر می گیریم.

کد کامل MainActivity

package com.gsm_developers.customtoast_gsm;

import android.content.Context;
import android.content.DialogInterface;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private Button ClickToShowToast;

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

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

        ClickToShowToast.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                showCustomAlert();
            }
        });
    }

    public void showCustomAlert() {

        Context context = getApplicationContext();
        LayoutInflater inflater = getLayoutInflater();

        View toastRoot = inflater.inflate(R.layout.mytoast, null);

        Toast toast = new Toast(context);

        toast.setView(toastRoot);
        toast.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL, 0, 0);
        toast.setDuration(Toast.LENGTH_LONG);
        toast.show();

    }
}

مشاهده می کنید که خروجی Toast سفارشی ما بدین شرح است.

آموزش برنامه نویسی اندروید با اندروید استودیو (بخش سی و هفتم: کار با 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 نیز ، به دلیل تاخیر چند ثانیه ای برای نمایش عدد فونت سایز، بهتر است که پاک شود.