ورود

View Full Version : توضیح در مورد متدها :



harani
شنبه 27 آبان 1391, 23:35 عصر
دوستان میشه کدهایی که مشخص کردمو توضیح بدین من تو اینا مشکل دارم :

1- در کد زیر کار onActivityResult و شرط اول و در شرط دوم resultCode چین و چیکار میکنن ؟؟

public void onActivityResult(int requestCode, int resultCode, Intent data)//a
{
if (requestCode == request_Code) {//b
if (resultCode == RESULT_OK) {//c
Toast.makeText(this,data.getData().toString(),
Toast.LENGTH_SHORT).show();//e
}
}
}


2-در اینجا startActivityForResult(data,1) java چی چیکار میکنه

Intent data = new Intent("Act3");//d
startActivityForResult(data,1);//c


3- در اینجا data.putExtra("x","Recive") java چیو چیکار میکنه

Intent data = new Intent("Act2");//x
data.putExtra("x","Recive");//d


4- در اینجا Bundle extras = getIntent().getExtras() java و extras.getString("x ") java چه کاهایی انجام میدن ؟؟

String defaultName="";//a
Bundle extras = getIntent().getExtras();//d
if (extras!=null)//f
{
defaultName = extras.getString("x");//g
}




5- و در نهایت در این کد خط data.SetDate چی و کارش چیست ؟؟؟ Uri چی ؟؟

EditText txt_username = (EditText) findViewById(R.id.txt_username);//l
Intent data = new Intent();//l
data.setData(Uri.parse(txt_username.getText().toSt ring()));//d
setResult(RESULT_OK, data);//d


با سپاس

Ghadiri_S
یک شنبه 28 آبان 1391, 01:49 صبح
سلام دوست عزیز.

سوالاتت کلا درمورد مدیریت اجرای اکتیویتی ها در اندروید هست. قبلش باید بدونی اکتیویتی چی هست. اگه قبلا با محیط های ویژوال برنامه نویسی کرده باشی مثل ویژوال بیسیک باید گفت اکتیویتی ها یک چیزی شبیه به Form های ویژوال هست. البته نه دقیقا ;)

وقتی شما داخل یک اکتیویتی هستی و برای مثال اگر داخلش یک دکمه داشته باشی و بخوایی هر وقت روش کلیک کردی یک اکتیویتی دیگه باز بشه اون اکتیوتی رو میتونی به دو شکل فراخوانی کنی یا با کمک دستور startActivity و یا به کمک دستور startActivityForResult

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

حالا نکته اینجاست از هر کدوم که بخوایی استفاده کنی باید اول یک Intent از اکتیویتی که میخوایی باز کنی بسازی بعد این Intent رو بدی به یکی از دستور های بالا

برای اینکار باید کلاس اکتیویتی مورد نظر رو به همراه اکتیویتی فعلی رو انتساب کنی به Intent مثلا اسم اکتیویتی فعلی من form1 هست و میخوام اکتیویتی با نام form2 رو باز کنم کد Intent مربوط به اون اینجوری میشه



Intent f = new Intent (form1.this,form2.class);


خوب حالا متغیر f که یک نوع Intent هست رو میتونی به کمک یکی از دو دستور قبلی بصورت زیر اجرا کنی



startActivityForResult(f,1);


یا



startActivity(f);


حالا سوال اینجاست که اون عدد 1 تو دستور startActivityForResult چی هست؟

Ghadiri_S
یک شنبه 28 آبان 1391, 01:54 صبح
این عدد در حقیقت یک عدد دلخواه هست که فقط موقع فراخوانی یک اکتیویتی که قصد داریم یک نتیجه ای رو ازش بگیریم استفاده میکنیم تا بتونیم اکتیوتی مورد نظر رو بعد از انجام وظایفش پیگیری کنیم. میشه گفت دقیقا یک کد رهگیری هست که تو ثبت نام های اینترنتی سایت بهمون میده تا بعدا بتونیم وضعیت ثبت نام رو پیگیری کنیم.

این جا هم درست مثل همین موضوع هست. داریم به اندروید میگیم که این اکتیوتی رو که اجرا کردم با این کد رهگیری که اینجا مثلا عدد 1 هست این اکتیویتی رو زیر نظر بگیر.

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

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

Ghadiri_S
یک شنبه 28 آبان 1391, 02:02 صبح
استفاده این کد رهگیری داخل تابع onActivityResult هست. اگه بخوایم رو مثال خودمون بگیم تو همون اکتیویتی که اسمش form1 بود میایم تابع onActivityResult رو ایجاد میکنیم. این تابع 3 تا پارامتر داره که عبارتند از:

requestCode

همینطور که میبینی اولین پارامتر این تابع هست و از نوع عددی هست. این عدد در حقیقت همون کد پیگیری هست که در بارش گفتم. خوب وقتی کارمون با اکتیویتی form2 تموم شد تابع onActivityResult اجرا میشه و مقدار این تابع برابر میشه با عدد 1 یا همون کد رهگیری که بهش دادیم. پس شما میتونی به کمک یک if ساده کنترل کنی ببینی این نتیجه که اومده از طرف کدوم اکتیوتی هست که اجرا کرده بودیم. مثلا اگر کد رهگیری 1 هست تابع a اجرا بشه و اگه کد رهگیری 2 هست تابع b اجرا بشه و الا ماشالله

Ghadiri_S
یک شنبه 28 آبان 1391, 02:12 صبح
resultCode

این کد که دومین پارامتر این تابع هست هم از نوع عددی هست و در حقیقت اکتیویتی form2 با این عدد به اکتیویتی form1 گزارش کار رو میده. که نتیجه مورد نظر رو به کجا رسونده. مثلا اگر مقدار -1 که همون RESULT_OK هست رو برگردونه به این معنی هست که کار با موفقیت انجام شده. البته این عددها رو هم میتونی برطبق نوع کاری که انجام میدی متفاوت باشه.

پس باز میتونید تو تابع onActivityResult یک شرط دیگه بزاری و چک کنی اکتیویتی مورد نظرت که با کد requestCode پیگیریش میکنی چه عددی رو تو resultCode برگردونده و با توجه به این عدد باز میتونی توابع مختلفی رو اجرا کنی. مثلا اگر عدد -1 برگشته یعنی نتیجه کار به خوبی انجام شده تابع c رو اجرا کن. اگر عدد 10 برگشته یعنی .... باید تابع d اجرا بشه و باز هم الا ماشالله

Ghadiri_S
یک شنبه 28 آبان 1391, 02:30 صبح
data

اما مقدار data که سومین پارامتر این تابع هست نوعش عددی نیست بلکه از نوع Intent هست. خوب اکتیویتی form2 که به کمک resultCode وضعیتش رو به اکتیویتی form1 گزارش داد. اگه بخواد یک سری اطلاعات و داده رو هم تحویل form1 بده باید داده ها رو داخل Intent بزاره که اینجا ما اون رو با نام data میشناسیمش. اطلاعات و داده ها رو میشه به کمک تابع getExtras از درون data خارج کرد.

قبل از اینکه بگم چطور این کار رو انجام میدیم باید به این نکته اشاره کنم که هر داده ای رو که میخوایم داخل Intent قرار بدیم باید بهش یک برچسب بزنیم تا به کمک این برچسب بتونیم داده مورد نظرمون رو داخل Intent پیدا کینم. مثلا اگر تو اکتیویتی form2 من بعد از کلی محاسبه به عدد 3.14 رسیدم و خواستم این عدد رو به اکتیویتی form1 تحویل بدم یه برچسب انتخاب میکنم مثلا number101 . اینجوری هر وقتی مقدار number101 رو فراخوانی کنم عدد 3.14 رو بهم میده. یا مثلا اگر تو اکتیویتی form2 عبارت IT IS GOOOD رو خواستم به اکتیویتی form1 تحویل بدم یک برچست براش انتخاب میکنم مثلا text202 . اینجوری هروقت text202 رو فراخونی کردم عبارت IT IS GOOOD رو بهم میده.

خوب حالا داخل تابع onActivityResult کد رهگیری requestCode و کد نتیجه resultCode اگر بهمون گفتن که اطلاعات مورد نظر از form2 رسیده میتونیم بصورت زیر اطلاعات مربوط به برچسب text202 رو از داخل data فراخوانی کنیم و داخل یک متغیر از نوع متنی به نام TXT قرار بدیم.



String TXT = data.getExtras().getString("text202");


خوب مشخص هست اگه بخوایم مقدار number101 رو بخونیم باید به جای getString از getInt استفاده کنیم و الا ماشالله



خوب تا اینجا هر چی گفتم از اکتیویتی form1 بود. حالا باید ببینم form2 چطور میتونه data و resultCode رو مقدار دهی بکنه؟

Ghadiri_S
یک شنبه 28 آبان 1391, 02:44 صبح
خوب هروقت کارمون داخل اکتیویتی form2 تمون شد و خواستیم form1 رو از چون و چند کار با خبر کنیم (به کمک resultCode ) و اگر داده هایی رو میخوایم به form1 تحویل بدیم (به کمک data) باید داخل form2 دوباره یک Intent تعریف کنیم.

البته چون قصد نداریم یک اکتیویتی جدید رو برای انجام پروسه ای جدید باز کنیم Intent رو بصورت خالی باز میکنیم. یعنی مثل مثال Intent اول نیازی به class و this ندارم. فقط کافی مثل کد زیر یک متغیر از نوع Intent تعریف کنیم.



Intent f = new Intent();


خوب اگر داده هایی رو داریم و میخواهیم برای form1 ارسال کنیم برای داده های خودمون یک برچسب (key) در نظر میگیریم. مثل همون number101 و text202 که توضیح دادم.
تابع putExtra این امکان رو به ما میده تا مقادیر داده ای رو به همراه برجسب خاصی در داخل Intent قرار بدیم. مثل کد زیر



f.putExtra("number101", 3.14);
f.putExtra("text202", "IT IS GOOD");


خوب این از data که قراره به دست تابع onActivityResult در اکتیویتی form1 برسه حالا نوبت resultCode هست. کافی به کمک تابع setResult یک عدد رو به عنوان resultCode به Intent ای که تعریف کردیم اختصاص بدیم. دقیقا مثل کد زیر



setResult(RESULT_OK, f);


خوب این خط که اجرا میشه بلافاصله تابع onActivityResult در اکتیویتی form1 اجرا میشه و مقادیر رو دریافت میکنه.

Ghadiri_S
یک شنبه 28 آبان 1391, 02:50 صبح
فقط یک نکته موند اون هم اینکه وقتی از اکتیویتی form1 میخوایم اکتیوتی form2 رو اجرا کنیم ممکن هست بخواهیم یک سری داده رو به form2 ارسال کنیم. در همون اول اشاره کردم که باید یک Intent تعریف کرد بعد اون Intent رو به کمک startActivityForResult یا startActivity اجراش کرد.

دقیقا قبل از اینکه دستور startActivityForResult یا startActivity رو اجرا کنید میتونید مثل کد قبل با تابع putExtra اطلاعات رو به form2 ارسال کرد. مثلا داده saeed رو با برچسب name می خوام به همین form2 ارسال کنیم. کد زیر رو باید اجرا کنیم.



Intent f = new Intent (form1.this,form2.class);
f.putExtra("name", "saeed");
startActivityForResult(f,1);


و یا



Intent f = new Intent (form1.this,form2.class);
f.putExtra("name", "saeed");
startActivity(f);


اما حالا تو اکتیویتی form2 این داده رو چطور میشه دریافت کرد؟

Ghadiri_S
یک شنبه 28 آبان 1391, 03:02 صبح
در داخل تابع onCreate اکتیویتی form2 به یک Bundle احتیاج داریم. Bundle درحقیقت اجازه میده تا به وضعیت ها دسترسی داشته باشیم که شامل Intent ها میشه. حتی اگه دقت کرده باشی خود تابع onCreate خودش یک پارامتر از نوع Bundle داره که وضعیت اکتیویتی رو در هنگام ایجاد دارد.

به کمک تابع getIntent میتونیم Intent رسیده یه اکتیویتی form2 رو بدست بگیریم. بعد به کمک getExtras میتونیم داده هایی که درون این Intent برچسب خوردن رو فراخوانی کنیم. پس برای اینکه مقدار name رو که به form2 فرستادیم رو بتونیم بخونیم اول یک متغیر برای مثال با نام e از نوع Bundle بصورت زیر ایجاد میکنیم.



Bundle e = getIntent().getExtras();


حالا میتونیم بصورت زیر مقدار برچست name رو داخل یک متغیر از نوع رشته ای ذخیره کنیم



String name = e.getString("name");



دوست عزیز امیدوارم تونسته باشم جواب سوالاتی رو که داشتید رو بدم.
البته یک نکته رو بگم و اون اینکه من برنامه نویسی با اندروید رو به تازگی شروع کردم اگر کم و کاستی تو توضیحاتم وجود داشته باشه که حتما هم داره بر حسب بی تجربگی من در اندروید بزار.

انشالله موفق باشی

harani
یک شنبه 28 آبان 1391, 11:46 صبح
آقا دمت گرم خیلی زحمت کشیدی اگه میشد دو سه تا تشکر دیگه م تو هرکدوم برات میزدم .

harani
یک شنبه 28 آبان 1391, 20:50 عصر
واقعاً از شما ممنونم خیلی عالی بود ولی درمورد قسمت 5 م میشه توضیحی بدید . میشه در مورد اونم یه راهنمایی کنید .

Ghadiri_S
یک شنبه 28 آبان 1391, 22:59 عصر
حقیقتش من با setData کار نکردم.

اما از اونجا که تو بخش 5 یک Intent تعریف شده و مقدار RESULT_OK رو بهش از طریق setResult نصبت داده میشه نتیجه گرفت که به کمک setData میخوایم مقدار وارد شده در txt_username رو در قالب داده به اکتیویتی که منتظر نتیجه در تابع onActivityResult هست ارسال کنیم.

همونجور هم که تو بخش 1 نگاه کنی عبارت زیر رو داره


Toast.makeText(this,data.getData().toString(),


احتمال میدم به کمک setData میشه بدون اینکه به داده برچسبی بزنیم داده را انتقال بدیم. که خوب اگر یک داده برای انتقال داشته باشیم کارایی خواهد داشت. باز هم بنظر من استفاده از برچسب و تابع putExtra مفیدتر از setData میتونه باشه که توضیحش رو دادم چرا که میتونیم داده های بیشتر و متنوع تری رو انتقال بدیم.

تو بخش 5 یک نکته در مورد Uriهست که خوب مربوط به بحث اکتیویتی ها نمیشه Uri ها در حقیقت نوعی آدرس تحت شبکه هستند و به کمک تابع parse میتونیم یک رشته معمولی رو به قالب Uri تبدیل کنیم. تو بخش 5 فقط داده ای که میخوایم به صورت جواب برگردونیم داده رو به Uri تبدیل کردیم و ارسال کردیم. حال این برنامه هست که با چنین داده ای کار داره. مثلا ممکن هست برنامه شما داده Int نیاز داشته باشه یا String و یا مثل همین مثالی که نوشتی نوع داده مورد استفادش Uri هست.

خود جاوا یک کلاس کامل برای کار با Uri داره که در بخش java.net.URI قابل دسترس هست. همین آدرس های اینترنتی که بصورت http:// یا ftp:// یا حتی آدرس های داخلی مثل file:// همشون یک نوع از Uri هستند. حالا باید دید تو برنامه مورد نظرت به چه منظور از این نوع داده داره استفاده میکنه.

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

harani
یک شنبه 28 آبان 1391, 23:58 عصر
بازم ممنون خیلی خیلی زحمت کشیدی .

spystickler
چهارشنبه 21 اسفند 1392, 11:23 صبح
سلام چطوری میشه یک باتن را در صفحه حرکت داد