سبد (0)

ایجاد UI انعطاف پذیر

آن چه در این آموزش فرا می گیرید:

  1. افزودن fragment در زمان اجرا
  2. جایگزین کردن یک fragment با دیگری

مواردی که باید مطالعه کرده باشید:

  • Fragmentها

خودتان امتحان کنید:

دانلود دمو »

ایجاد یک UI انعطاف پذیر

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

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

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

کلاس FragmetnManager به شما اجازه می دهد که زمان اجرا fragmentها را به یک activity اضافه کنید، یا از آن حذف کنید و یا با همدیگر جایگزین کنید. با این کار fragmentها پویا می شوند.


آموزش اندروید - افزودن یک fragment به Activity در زمان اجرا

در آموزش اندروید بیاموز قبل دیدیم که در فایل چیدمان می توانیم fragmentها را با استفاده از عنصر <fragment> تعریف کرد. حال به جای تعریف fragment در فایل اجرا می خواهیم یک fragment را در زمان اجرا به یک Activity اضافه کنیم. این کار هنگامیکه شما قصد دارید fragmentها را در زمان حیات activity تغییر بدهید، ضروری است.

برای انجام عملیاتی مانند افزودن یا حذف یک fragment، می بایست از FragmentManager برای ایجاد FragmentTransaction استفاده کرد، این کلاس APIهایی برای افزودن، حذف یا جایگزینی و اجرای دیگر عملیات fragment فراهم می کند.

اگر activity شما اجازه دهد که fragmentها حذف یا اضافه شوند، شما می بایست fragment (های) اولیه را در متد ()onCreate به activity اضافه کنید.

یک قانون مهم در برخورد با fragmentها -خصوصاً آن هایی که زمان اجرا به activity اضافه می شوند- عبارت است از اینکه fragment می بایست دارای یک view کانتینر در چیدمان باشد و fragment درون آن قرار می گیرد.

چیدمان زیر را می توان به جای چیدمانی که در آموزش اندروید درس قبلی اشاره کردیم به کار ببریم. در آن چیدمان تنها یک fragment در زمان اجرا نمایش داده می شد. برای اینکه fragmentها با یکدیگر جایگزین شوند، چیدمان activity دارای یک FrameLayout خالی است که به عنوان fragment کانتینر عمل می کند.

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

فایل چیدمان

res/layout/news_articles.xml:

<FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

داخل activity متد ()getSupportFragmentManager را فراخوانی کنید تا بتوانیم از FragmentManager کتابخانه ی پشتیبان استفاده کنیم. بعد از آن ()beginTransaction را برای ایجاد یک FragmentTransaction صدا بزنید و سپس متد ()add، یک fragment را اضافه می کند.

شما می بایست چندین عملیات fragment را با استفاده از FragmentTransaction روی activity اجرا کنید. هنگامی که شما آماده ی تغییرات هستید، می بایست متد ()commit را اجرا نمایید.

در مثال زیر، نجوه ی افزودن fragment به چیدمان بالا آورده شده است:

افزودن fragment به چیدمان در زمان اجرا

 
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

public class MainActivity extends FragmentActivity{
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.news_articles);

// Check that the activity is using the layout version with
// the fragment_container FrameLayout
if(findViewById(R.id.fragment_container)!=null){

// However, if we're being restored from a previous state,
// then we don't need to do anything and should return or else
// we could end up with overlapping fragments.
if(savedInstanceState !=null){
return;
}

// Create a new Fragment to be placed in the activity layout
HeadlinesFragment firstFragment =new HeadlinesFragment();

// In case this activity was started with special instructions from an
// Intent, pass the Intent's extras to the fragment as arguments
firstFragment.setArguments(getIntent().getExtras());

// Add the fragment to the 'fragment_container' FrameLayout
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_container, firstFragment).commit();
}
}
}

به این دلیل که fragment در زمان اجرا به کانتینر FrameLayout اضافه شده است، activity می تواند fragment را حذف کند یا با سایر fragmentها جا به جا کنید.


آموزش اندروید - جایگزین کردن یک fragment با دیگری در زمان اجرا

فرایند جایگزین کردن fragment مشابه افزودن آن است، با این تفاوت که به جای متد ()add می بایست از متد ()replace استفاده کنیم.

به خاطر داشته باشید، وقتی که یک عملیات fragment انجام می دهید، مانند جایگزینی یا حذف fragment، معمولاً باید به کاربر اجازه بدهیم تا تغییرات را برگرداند و به اصطلاح تغییرات را undo کند. برای اینکه به کاربر اجازه دهیم تا در عملیات fragment به عقب برگردد، می بایست متد ()addToBackStack را قبل از اجرای FragmentTransaction فراخوانی کنیم.

Note

توجه: هنگامی که یک fragment را حذف می کنیم یا جایگزین می کنیم و عملیات را به پشته اضافه می کنیم، fragmentی که حذف شده است متوقف می شود (و از بین نمی رود). اگر کاربر به عقب برگردد تا fragment را بازیابی کند، fragment مجدداً شروع می شود. اگر عملیات را به پشته اضافه نکنید، fragment هنگامی که حذف یا جایگزین می شود از بین می رود.

مثال زیر جایگزینی یک fragment با سایر fragmentهاست:

جایگزین کردن یک fragment با دیگری


// Create fragment and give it an argument specifying the article it should show
ArticleFragment newFragment =new ArticleFragment();
Bundle args =new Bundle();
args.putInt(ArticleFragment.ARG_POSITION, position);
newFragment.setArguments(args);

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack so the user can navigate back
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();

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

// ![DATA[ try{ loc=location.pathname; //if (loc.toUpperCase().indexOf(".ASP")0) loc=loc+"default.asp"; txt='<a href="http://www.facebook.com/sharer.pp?u=https://beyamooz.com'+loc+'" target="_blank" title="Facebook">' txt=txt+''; txt=txt+''; txt=txt+''; //txt=txt+''; //txt=txt+'';
// ]]>
تمامی محصولات و خدمات این وبسایت، حسب مورد دارای مجوزهای لازم از مراجع مربوطه می‌باشند و فعالیت‌های این سایت تابع قوانین و مقررات جمهوری اسلامی ایران است.
logo-samandehi مجوز نشر دیجیتال از وزرات فرهنگ و ارشاد اسلامی پرداخت آنلاین -  بانک ملت معرفی بیاموز در شبکه سه