کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

آموزش ساخت view پیشرفته در اندروید

 

clip_image001

دوره آموزش برنامه نویسی اندروید

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

 

آموزش ساخت view پیشرفته در اندروید 

فهرست محتوا

1. view  های سفارشی

View   های پیش فرض

چگونه اندروید سلسله مراتب view  را رسم می کند

دلایل و هدف از ایجاد view ها

کابرد و وظیفه ی view ها

شیوه های مختلف ایجاد view های سفارشی

استفاده از view های جدید در فایل های طرح بندی (layout files)

تهیه ی تصویر (screenshot) از view ها

2. Compound views چیست و چه امکاناتی ارائه می دهد؟

3. آموزش ایجاد view های سفارشی

ایجاد view های سفارشی

اندازه بندی

تعریف و پیاده سازی layout manager سفارشی

4. چرخه ی حیات

رخدادهای چرخه ی حیات مربوط به پنجره

Traversal life-cycle events (رخدادهای پیمایشی چرخه ی حیات)

چرخه ی حیات activity

5. تعریف صفت مشخصه های اضافه بر سازمان ویژه ی View های سفارشی

6. تمرین ایجاد و پیاده سازی Compound view

ایجاد پروژه

تعریف و بکاربری خصیصه های اضافه بر سازمان

ایجاد compound view

ایجاد کردن activity پروژه

7. رابط برنامه سازی کاربردی Canvas (API)

چند نکته درباره ی canvas API

کلاس Canvas

کلاس Paint

shader (سایه زن)

8. ماندگار سازی داده و حالت view

 1. view های سفارش سازی شده

View های پیش فرض

چهارچوب نرم افزاری سیستم اندروید android framework view های پیش فرض متعددی عرضه می کند، با این وجود برنامه نویس می تواند در صورت تمایل view های پیش فرض خود را طراحی کرده، سپس آن را در برنامه ی کاربردی خود مورد استفاده قرار دهد. view کلاس پایه ی تمامی view ها است.

 

سلسله مراتب view در اندروید

 

چگونه اندروید سلسله مراتب  view را رسم می کند.

به محض اینکه یک activity در کانون قرار می گیرد (receives the focus)، باید گره ی اصلی (root node) سلسه مراتب طرح بندی (layout hierarchy) را به سیستم اندروید تحویل دهد. پس از این مرحله سیستم اندروید به فرایند رسم را آغاز می کند.

پروسه ی رسم با گره ی اصلی طرح کلی شروع می شود. سلسله مراتب طرح بندی به ترتیب تعریف (declaration) طی (پیمایش) می شود، به گونه ای که ابتدا view های والد و به دنبال آن view های فرزند، فرزندان نیز به ترتیب تعریف رسم می گردند.

رسم طرح کلی (layout) یک فرایند دو مرحله ای می باشد.

مرحله ی اندازه گیری، ثبت اندازه (measuring pass) در متد measure(int، int) پیاده سازی شده و پیمایش از بالا به پایین (top-down traversal) سلسله مراتب view صورت می گیرد. هر View ای اندازه های خود را ذخیره می کند.

Layout pass- در متد layout(int، int، int، int) پیاده سازی شده و در این مرحله نیز پیمایش از بالا به پایین سلسله مراتب view صورت می گیرد. طی مرحله ی نام برده هرlayout manager  مسئول جای گذاری و قراردهی کلیه ی زیرمجموعه های خود می باشد، همچنین اندازه هایی را بکار می برد که در مرحله ی ثبت اندازه (measuring pass) محاسبه و ضبط شد.

نکته

دو مرحله ی بالا هر دو به صورت همزمان رخ می دهند.

نکته

Layout manager ها قادرند چندین بار مرحله ی اول را اجرا کنند. به طور مثال، LinearLayout با پشتیبانی از weight attribute فضای باقی را بین view ها تقسیم می کند و،RelativeLayout view های زیرمجموعه را چندین مرتبه اندازه گیری می کند تا بدین ترتیب محدودیت های موجود در فایل طرح بندی برطرف شود.

یک view یا activity قادر است با فراخوانی متد requestLayout() مرحله ی اندازه گیری و طرح بندی را دوباره فعال سازی و اجرا کند.

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

دلایل و هدف از ایجاد view ها

برنامه نویس view ها را زمانی ایجاد می کنند که فراهم آوردن تجربه ی دلخواه برای کاربر از طریق view های پیش فرض امکان پذیر نمی باشد.

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

کابرد و وظیفه ی  view ها

  Viewها مسئول اندازه گیری، (در مورد ViewGroup) طرح بندی و رسم خود و عناصر زیرمجموعه های خود هستند. علاوه بر این viewها وظیفه ی دیگری نیز دارند و آن ذخیره ی حالت رابط کاربری (UI state) و مدیریت رخدادهای touch می باشد.

شیوه های مختلف ایجاد  view های سفارشی

View ها به دو رده طبقه بندی می شوند.

1. Compound Views )View های مرکب(

2. (Custom Views) Viewهای سفارشی و آن از طریق این دو روش زیر صورت می گیرد.

با بسط دادن view موجود

با بسط دادن کلاس view

 

استفاده از  view های جدید در فایل های طرح بندی (layout files)

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

<?xml version="1.0" encoding="utf-8" ?>

‎‎<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

<button android:id="@+id/button1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Button" />

<de.vogella.android.ownview.mydrawview android:id="@+id/myDrawView1"

android:layout_width="wrap_content"

android:layout_height="wrap_content" />

    ‎ ‎    </linearlayout>

 

نکته

همچنین می توانید فضای نام (namespace) را در فایل طرح کلی، درست مشابه فضای نام Android، تعریف کنید.

تهیه ی تصویر (screenshot) از  view ها

هر کلاس view  تنها مسئول ایجاد و تهیه ی نمونه تصویر از صفحه نمایش جاری خود است، کد زیر مثالی را در این زمینه ارائه می دهد.

# Build the Drawing Cache
                view.buildDrawingCache();
                # Create Bitmap
                Bitmap cache = view.getDrawingCache();
                # Save Bitmap
                saveBitmap(cache);
                view.destroyDrawingCache();

ایجاد Compound view

Compound view (که به Compound component = مولفه های مرکب نیز مصطلح می باشند) ViewGroups های از پیش پیکربندی شده (pre-configured) بر پایه ی view های موجود هستند.

برنامه نویس می تواند با افزودن رابط برنامه سازی کاربردی سفارشی (custom API)، بروز رسانی و پرس و جو از وضعیت View های مرکب را ترتیب دهد.

برای ایجاد چنین امکانی باید یک فایل طرح بندی تعریف کرده، سپس آن را به view مرکب تخصیص دهید. در پیاده سازی view مرکب، لازم است تعامل view  را از پیش تعریف (pre-define) کنید. در مرحله ی بعدی یک فایل طرح بندی تعریف می کنید و کلاس ViewGroup مربوطه را به ارث می برید. حال در این کلاس فایل طرح بندی را بارگذاری (inflate) کرده و منطق اتصال View را پیاده سازی می کنید.

نکته

در صورت ایجاد view های اختصاصی خود، ابتدا کلاس ViewConfiguration را در نظر بگیرید، چرا که کلاس ذکر شده حاوی چندین ثابت (constant) است که ویژه ی تعریف view ها مورد استفاده قرار می گیرد.

برای رسم view ها به طور معمول از رابط برنامه سازی کاربردی 2D Canvas بهره می گیریم.

اندازه بندی

layout manager متد onMeasure() را از view مربوطه فرا می خواند. view پارامتر layout را ازlayout manager دریافت می کند.

layout manager وظیفه ی اندازه بندی تمامی زیرمجموعه های خود را دارد.

view مورد نظر باید متد setMeasuredDimenstion(int، int) را با نتیجه صدا بزند.

تعریف و پیاده سازی layout manager  سفارشی

برنامه نویس می تواند با به ارث بردن کلاس ViewGroup، layout manager خود را ایجاد کرده و بکار ببرد. این امر به برنامه نویس اجازه می دهد layout manager های موثرتر و کارامدتری پیاده سازی کرده یا جلوه ها و افکت هایی را بوجود آورده و بکار ببندد که در حال حاضر به صورت پیش فرض در محیط اندروید موجود نمی باشد.

یک layout manager سفارشی متدهای onMeasure() و onLayout() را بازنویسی (override) کرده، سپس به اندازه بندی و محاسبات مربوط به زیرمجموعه های خود به صورت اختصاصی می پردازد.

نکته

جهت محاسبه ی اندازه ی زیرمجموعه (child) می توان از متد measureChildWithMargins() که مشتق کلاس ViewGroup می باشد بهره گرفت.

توصیه می شود هر گونه پارامتر اضافی layout را حین پیاده سازی ViewGroup در یکی از کلاس های داخلی (viewgroup) ذخیره کنید. به عنوان مثال LinearLayout.LayoutParams پارامترهای اضافه بر سازمان مختص LinearLayout مثل پارامتر layout_weight را پیاده سازی می کند.

  4. چرخه ی حیات

رخدادهای چرخه ی حیات مربوط به پنجره

  یک view زمانی نمایش داده می شود که به یک layout hierarchy (سلسله مراتب طرح بندی) متصل باشد. layout hierarchy خود به یک پنجره متصل می باشد.

یک view دارای چندین life-cycle hook متعدد می باشد.

تابع onAttachedToWindow() هنگامی صدا زده می شود که پنجره ی مورد نظربه طور کامل در دسترس و حاضر باشد.

تابع onDetachedFromWindow() زمانی بکار گرفته می شود که که view از والد خود گسسته شده و یا از آن حذف گردد ( والد نیز خود به پنجره متصل باشد). به طور مثال این امر وقتی رخ می دهد که activity بازیابی (recycle) شده باشد (با فراخوانی متد finished()) یا view در ListView بازیابی شده باشد.

متد onDetachedFromWindow() را می توان جهت متوقف کردن پویانمایی (animation ها)، پاک یا رها سازی منابع بکار گرفته شده توسط view مورد استفاده قرار داد.

Traversal life-cycle events (رخدادهای پیمایشی چرخه ی حیات)

عبارتند از چهار آیتم : Animate، Measure، Layout و Draw.

)رخدادهای پیمایشی چرخه ی حیات

 

تمامی View ها باید از نحوه ی اندازه و طرح بندی خود اطلاع داشته باشند. متد requestLayout() به view دستور می دهد خود را اندازه گیری (measure) و طرح بندی (layout) کند. به این خاطر که عملیات نام برده ممکن است طرح بندی دیگر viewها را تحت تاثیر قرار دهد، تابع requestLayout() را نیز از والد خود صدا می زند.

نکته

این بازفراخوانی (فراخوانی بازگشتی = recursive call) به این دلیل که منجر به محاسبه ی دوباره تعداد زیادی سلسله مراتب طی عملیات اندازه گیری و طرح بندی می شود سنگین تلقی می گردد، به این خاطر هم است که تودرتو (nestle) کردن بیش از حد layout به هیچ وجه توصیه نمی شود.

متد onMeasure() اندازه ی view و زیرمجموعه های آن را تعیین می کند. تنظیم ابعاد view نیز به وسیله ی متد setMeasuredDimension() صورت می گیرد.

onLayout()، view ها را بر اساس نتیجه ای که از فراخوانی متد onMeasure() بدست می آید، جای گذاری (position) می کند.

چرخه ی حیات  activity

View ها به رخدادهای چرخه ی حیات activity دسترسی ندارد. اگر view ها بنا به دلایلی نیاز به آگاهی از رخدادهای ذکر شده پیدا کردند، برنامه نویس باید یک رابط (interface) در view ایجاد کرده و بدنبال آن رابط ایجاد شده را در life-cycle method های activity صدا بزند.

5. تعریف صفت مشخصه های اضافه بر سازمان ویژه ی View های سفارشی

می توان برای Compound view ها و Custom view ها خصیصه های اضافی تعریف کرد. برای این منظور یک فایل attrs.xml در پوشه ی res/ ایجاد کنید. مثال زیر نمونه ای از خصیصه های تعریف شده برای view ی جدیدی به نام ColorOptionsView را نمایش می دهد.

<?xml version="1.0" encoding="utf-8" ?>

‎‎<resources>

<declare-styleable name="ColorOptionsView">

<attr name="titleText" format="string" localization="suggested" />

<attr name="valueColor" format="color" />

</declare-styleable>

</resources>

جهت استفاده از خصیصه های بالا در فایل طرح بندی (layout file)، باید آن ها را در سرآیند  header XML تعریف کنید. در کد لیست (listing) زیر این اتفاق از طریق xmlns:custom رخ می دهد. این خصیصه ها همچنین به view ها تخصیص داده می شوند.

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"

               xmlns:tools="http://schemas.android.com/tools"

    <!-- define new name space for your attributes -->

  xmlns:custom="http://schemas.android.com/apk/res/com.vogella.android.view.compoundview"

            android:layout_width="match_parent"

            android:layout_height="match_parent"

            android:orientation="vertical"

            >

      <!-- Assume that this is your new component. It uses your new attributes -->

      <com.vogella.android.view.compoundview.coloroptionsview android:layout_width="match_parent"                                                      android:layout_height="?android:attr/listPreferredItemHeight"

custom:titletext="Background color"

custom:valuecolor="@android:color/holo_green_light"

/>

</linearlayout>

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

package com.vogella.android.view.compoundview;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
public class ColorOptionsView extends View {
private View mValue;
private ImageView mImage;
public ColorOptionsView(Context context
، AttributeSet attrs) {
   
super(context، attrs);
    TypedArray a = context.obtainStyledAttributes(attrs
،
   R.styleable.Options
، 0، 0);
    String titleText = a.getString(R.styleable.Options_titleText);
   
int valueColor = a.getColor(R.styleable.Options_valueColor،
   android.R.color.holo_blue_light);
    a.recycle();
   
// more stuff
 
}
}

 6. تمرین ایجاد و پیاده سازی Compound view

ایجاد پروژه

برای این تمرین یک پروژه ی جدید با داده های زیر ایجاد کنید.

جدول 1. پروژه ی جدید اندروید

خصوصیات 

مقدار 

اسم برنامه ی کاربردی 

Compound view example

اسم پروژه 

com.vogella.android.customview.compoundview

نام پکیج 

com.vogella.android.customview.compoundview

API (Minimum، Target، Compile with) 

 (آخرین ویرایش)Latest

 (قالب)Template 

Empty Activity

Activity 

MainActivity

 (طرح کلی)Layout 

activity_main

 

تعریف و بکاربری خصیصه های اضافه بر سازمان

فایل attribute که attrs.xml خوانده می شود را در پوشه ی res/values ایجاد کنید.

<?xml version="1.0" encoding="utf-8" ?>

‎‎<resources>

<declare-styleable name="Options">

<attr name="titleText" format="string" localization="suggested" />

<attr name="valueColor" format="color" />

</declare-styleable>

</resources>

فایل طرح بندی (layout) را که activity از آن استفاده می کند به صورت زیر تغییر دهید.

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

xmlns:custom="http://schemas.android.com/apk/res/com.vogella.android.view.compoundview"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

android:showdividers="middle"

android:divider="?android:attr/listDivider"

tools:context=".MainActivity">

<com.vogella.android.view.compoundview.coloroptionsview

android:id="@+id/view1"

android:layout_width="match_parent"

android:layout_height="?android:attr/listPreferredItemHeight"

android:background="?android:selectableItemBackground"

android:onclick="onClicked" custom:titletext="Background color"

custom:valuecolor="@android:color/holo_green_light"

/>

<com.vogella.android.view.compoundview.coloroptionsview

android:id="@+id/view2"

android:layout_width="match_parent"

android:layout_height="?android:attr/listPreferredItemHeight"

android:background="?android:selectableItemBackground"

android:onclick="onClicked"

custom:titletext="Foreground color"

custom:valuecolor="@android:color/holo_orange_dark"

/>

‎‎</linearlayout> 

 

 ایجاد compound view

ابتدا فایل طرح بندی زیر را به نام view_color_options.xml ویژه ی compound view خود خلق کنید.

‎‎‎‎<?xml version="1.0" encoding="utf-8" ?>

‎‎<merge xmlns:android="http://schemas.android.com/apk/res/android">

<textview android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_weight="1"

android:layout_centervertical="true"

android:layout_marginleft="16dp"

android:textsize="18sp" />

<view android:layout_width="26dp"

android:layout_height="26dp"

android:layout_centervertical="true"

android:layout_marginleft="16dp"

android:layout_marginright="16dp" />

<imageview android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginright="16dp"

android:layout_centervertical="true"

android:visibility="gone" />

</merge>

حال compound view زیر را ایجاد کنید.

package com.vogella.android.customview.compoundview;
import com.vogella.android.view.compoundview.R;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
public class ColorOptionsView extends LinearLayout {
 
private View mValue;
 
private ImageView mImage;
 
public ColorOptionsView(Context context
، AttributeSet attrs) {
   
super(context، attrs);
    TypedArray a = context.obtainStyledAttributes(attrs
،
            R.styleable.ColorOptionsView
، 0، 0);
    String titleText = a.getString(R.styleable.ColorOptionsView_titleText);
   
int valueColor = a.getColor(R.styleable.ColorOptionsView_valueColor،
            android.R.color.holo_blue_light);
    a.recycle();
    setOrientation(LinearLayout.HORIZONTAL);
    setGravity(Gravity.CENTER_VERTICAL);
    LayoutInflater inflater = (LayoutInflater) context
           .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    inflater.inflate(R.layout.view_color_options
، this، true);
    TextView title = (TextView) getChildAt(
0);
    title.setText(titleText);
    mValue = getChildAt(
1);
    mValue.setBackgroundColor(valueColor);
    mImage = (ImageView) getChildAt(
2);
  }
 
public ColorOptionsView(Context context) {
   
this(context، null);
  }
 
public void setValueColor(int color) {
    mValue.setBackgroundColor(color);
  }
 
public void setImageVisible(boolean visible) {
    mImage.setVisibility(visible ? View.VISIBLE : View.GONE);
  }
}

 

 ایجاد کردن activity پروژه

کد activity را به ترتیب زیر اصلاح کرده و برنامه ی کاربردی خود را راه اندازی کنید.

package com.vogella.android.customview.compoundview;
import com.vogella.android.view.compoundview.R;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
  @Override
 
protected void onCreate(Bundle savedInstanceState) {
   
super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
  }
  @Override
 
public boolean onCreateOptionsMenu(Menu menu) {
   
// Inflate the menu; this adds items to the action bar if it is present.
   
getMenuInflater().inflate(R.menu.activity_main
، menu);
   
return true;
  }
 
public void onClicked(View view) {
    String text = view.getId() == R.id.view1 ?
"Background" : "Foreground";
    Toast.makeText(
this، text،
Toast.LENGTH_SHORT).show();
  }
}

 

 

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

نتیجه استفاده از component view

 

7. رابط برنامه سازی کاربردی Canvas (API)

چند نکته درباره ی canvas API

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

عملیات رسم روی سطح Bitmap صورت می گیرد. کلاس Canvas متدهای مورد نیاز عملیات رسم را روی یک نقشه ی بیتی فراهم می کند و کلاس Paint چگونگی رسم روی نقشه ی بیتی ذکر شده را تعیین می کند.

کلاس  Canvas

شی Canvas دربردارنده ی نقشه ی بیتی است که طراح روی آن رسم را صورت می دهد. شی نام برده همچنین متدهای لازم جهت ترتیب دهی عملیات رسم از جمله توابع drawARGB() برای رسم یک رنگ خاص، drawBitmap() به منظور رسم Bitmap، drawText() جهت رسم یک متن و drawRoundRect() نیز برای کشیدن یک مربع مستطیل با گوشه های گرد و غیره را عرضه می کند.

کلاس Paint

جهت رسم روی شی Canvas لازم است یک شی از نوع  Paint را مورد استفاده قرار دهید.

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

متد setStyle()  است که مشخص می کند تنها نمای کلی، پیرامون یا محیطoutline (Paint.Style.STROKE)  یا بخش پر شده (Paint.Style.FILL) یا حتی هر دو (Paint.Style.STROKE_AND_FILL) باید رسم شوند.

می توانید با استفاده از متد setAlpha()، مجرای آلفای (alpha channel) کلاس Paint را سِت (انتخاب) کنید.

به واسطه ی shader (سایه زن ها) می توان شی  Paint را با چندین رنگ مختلف پر کرد.

shader (سایه زن)

Shader یا همان سایه زن قادر است محتوایی که قرار است توسط شی  Paint رسم شود را تعیین کند. برای مثال می توان با بهره گیری از BitmapShader تعیین کرد، یک نقشه ی بیتی ویژه ی رسم بکارگرفته شود. این قابلیت به طراح یا برنامه نویس امکان می دهد، برای مثال تصویری با گوشه های گرد رسم کند. برای این منظور تنها کافی است یک BitmapShader مختص شی Paint معرفی کرده و به کمک تابع drawRoundRect() مربع مستطیلی با گوشه های گرد رسم کرد.

دیگر Shader هایی که توسط محیط اندروید ارائه می شوند عبارتند از LinearGradient، RadialGradient و SweepGradient. اقلام نام برده به منظور ایجاد یا رسم گرادیان (Gradient) های رنگ مورد استفاده قرار می گیرند.

برای استفاده از Shader باید آن را به واسطه ی فراخوانی متد setShader() به شی  Paint نسبت دهید.

چنانچه ناحیه ی پر شده بزرگتر از Shader ها بود، در آن صورت برنامه نویس می تواند از طریق Shader tile mode مشخص کند که فضای باقی مانده چگونه پر شود. ثابت (constant) Shader.TileMode.CLAMP به سیستم دستور می دهد که گوشه ها یا لبه ها را برای پر کردن فضای اضافی بکار ببرد یا ثابت Shader.TileMode.MIRROR تصویر مربوطه را قرینه سازی می کند و Shader.TileMode.REPEAT نیز فرمان تکرار دوباره تصویر را می دهد.

8. ماندگار سازی داده و حالت view

عمده ی view های متعارف موجود این توانایی را دارند که حالت خود را ذخیره کنند تا بدین وسیله حالت مذکور توسط سیستم ماندگار شود. سیستم اندروید به منظور ذخیره و احیا سازی حالت یا وضعیت view مورد نظر توابع onSaveInstanceState() و  onRestoreInstanceState(Parcable) را صدا می زند.

حالت پیش فرض یا قردادی بدین ترتیب است که برای ایجاد امکان ماندگار سازی داده، کلاس View.BasedSavedState به عنوان یک کلاس داخلی ایستا (inner static class) در view به ارث برده می شود (extend).

اندروید بر اساس شناسه ی View مربوطه در شِمای کلی (layout) به دنبال آن view می گردد، سپس  یک Bundle به view مزبور ارسال می کند. حال view با استفاده از Bundle حالت (state) خود را ذخیره می کند.

باید حالت رابط کاربری را درست در همان وضعیتی که کاربر آن را ترک کرده، ذخیره کرد، به عنوان مثال می توان به موقعیت نوار پیمایش (scroll) اشاره کرد.

1394/07/27 9913 3538
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...