Omid Zakeri

مدیر انجمن
  • تعداد ارسال ها

    107
  • تاریخ عضویت

  • آخرین بازدید

  • Days Won

    25

تمامی ارسال های Omid Zakeri

  1. یکی از جدیدترین تحولات در دنیای اندروید انتشار API Google Places برای Android است. این API جدید به ما دسترسی کامل به پایگاه داده گوگل برای 100 میلیون مکان می دهد. چه چیزی در مورد این API عالی است، برای دریافت داده ها از گوگل، بدون XML، یا تجزیه Json باید در مشتری انجام می شود. تمام تجزیه و تحلیل درخواست و پاسخ توسط سرویس گیرنده API Android Places انجام می شود. این به ما می دهد، بسیاری از روش های جدید راحتی که ما می توانیم به طور مستقیم به داده های API دسترسی داشته باشیم. همه ما باید انجام دهیم این است که از کلید API در پروژه استفاده کنیم. انتشار مکان های آندروید API نه تنها دسترسی به داده ها را ساده تر می کند، بلکه همچنین توسعه دهندگان را از پیگیری طول و عرض جغرافیایی می کند. پیش از این، برای دسترسی به داده های موقعیت مکانی در Android، باید تمام اطلاعات از یک سرویس وب را با عبور از پارامترهای مختلف مانند طول و عرض جغرافیایی به آن بازگردانید. API استفاده شده در آن زمان API Google Maps بود. اما اکنون خوشبختانه هیچ چیز از این نوع باید انجام شود. به عنوان مکان جدید Android API به اندازه کافی قدرتمند برای تشخیص مکان فعلی شما و بازیابی تمام داده های محل به صورت خودکار. API Google Places برای Android دارای شش ویژگی جدید است: Place Picker UI widget. Current Place . Place Autocomplete Place Add . Place Report. Place Details. این قسمت را در قسمت dependencies اضافه کنید: compile 'com.google.android.gms:play-services:8.4.0' manifest 2 3 <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/> permissions in the manifest <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> PlacePicker یک ویجت UI جدید است که با Places API معرفی شده است. این ویجت می تواند به شدت تلاش های توسعه را در یک سناریوی که نیاز به انتخاب یک مکان نزدیک را دارد، کاهش دهد. ویجت آندروید PlacePicker، یک نقشه و یک لیست از مکان های نزدیک را نمایش می دهد. با استفاده از این ویجت کاربر می تواند یک مکان را انتخاب کند، جزئیات آن به فعالیت تماس می شود. یکی دیگر از ویژگی های فوق العاده در مورد PlacePicker این است که اجازه می دهد سفارشی سازی هدر ها نیز داشته باشد. برای مثال اگر خواص colorPrimary و colorPrimaryDark را در styles.xml تنظیم کرده باشید. آنها می توانند در رابط کاربری PlacePicker نیز به ارث برده شوند، فقط برای حفظ یکپارچگی در جریان برنامه. سورس برنامه را دانلود کنید و از آن لذت ببرید Good Luck دانلود سورس PlacePicker-master.zip
  2. ویجت یک برنامه ی کوچک و یا یک کنترل از برنامه ی اندروید شما می باشد که در صفحه ی home قرار گرفته است. ویجت ها می توانند به راحتی در دسترس باشند، چرا که به شما اجازه می دهند تا برنامه های مورد علاقه ی خود را روی صفحه home قرار دهید تا به سرعت به آنها دسترسی داشته باشید. احتمالا چند ویجت متداول از جمله ویجت موسیقی، آب و هوا و ساعت، را دیده اید. ویجت ها می توانند انواع مختلفی داشته باشند از قبیل ویجت اطلاعات، ویجت های مجموعه، ویجت های کنترل و ویجت های چندگانه. اندروید یک چارچوب کامل به ما ارائه می دهد تا ویجت های خود را گسترش دهیم. Widget - XML file برای ایجاد یک ویجت کاربردی، ابتدا چیزی که نیاز دارید، شی Object AppWidgetProviderInfo است که شما در یک فایل XML ویجت جداگانه تعریف می کنید. برای انجام این کار، بر روی پروژه خود راست کلیک کرده و یک پوشه جدید به نام xml ایجاد کنید. حالا روی پوشه تازه ایجاد شده راست کلیک کرده و یک فایل XML جدید ایجاد کنید. نوع منبع فایل XML باید به AppWidgetProvider تنظیم شود. در فایل xml برخی از خواص را به صورت زیر تعریف می کنید: <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="146dp" android:updatePeriodMillis="0" android:minHeight="146dp" android:initialLayout="@layout/activity_main"> </appwidget-provider> Widget - Layout file حالا شما باید طرح ویجت خود را در فایل پیش فرض XML خود تعریف کنید. شما می توانید قطعات را برای تولید xml خودکار بکشید. Widget - Java file پس از تعریف طرح، در حال حاضر یک فایل JAVA جدید ایجاد کنید یا از موجود استفاده کنید و آن را با کلاس AppWidgetProvider گسترش دهید و روش بهروزرسانی آن را به صورت زیر تعریف کنید. در روش به روز رسانی، شما باید شیء دو کلاس را که PendingIntent و RemoteViews هستند تعریف کنید. نحو آن : PendingIntent pending = PendingIntent.getActivity(context, 0, intent, 0); RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.activity_main); Widget - Manifest file شما همچنین باید AppWidgetProvider را در فایل manifest خود به شرح زیر اعلام کنید: <receiver android:name="ExampleAppWidgetProvider" > <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/example_appwidget_info" /> </receiver> MainActivity.java package com.example.omidza.myapplication; import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.widget.RemoteViews; import android.widget.Toast; public class MainActivity extends AppWidgetProvider{ public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) { for(int i=0; i<appWidgetIds.length; i++){ int currentWidgetId = appWidgetIds[i]; String url = "http://www.tutorialspoint.com"; Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setData(Uri.parse(url)); PendingIntent pending = PendingIntent.getActivity(context, 0,intent, 0); RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.activity_main); views.setOnClickPendingIntent(R.id.button, pending); appWidgetManager.updateAppWidget(currentWidgetId,views); Toast.makeText(context, "widget added", Toast.LENGTH_SHORT).show(); } } } res/layout/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:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity" android:transitionGroup="true"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Tutorials point" android:id="@+id/textView" android:layout_centerHorizontal="true" android:textColor="#ff3412ff" android:textSize="35dp" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Widget" android:id="@+id/button" android:layout_centerHorizontal="true" android:layout_marginTop="61dp" android:layout_below="@+id/textView" /> </RelativeLayout> res/xml/mywidget.xml. <?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="146dp" android:updatePeriodMillis="0" android:minHeight="146dp" android:initialLayout="@layout/activity_main"> </appwidget-provider> AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.omidza.myapplication" > <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <receiver android:name=".MainActivity"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/mywidget"></meta-data> </receiver> </application> </manifest>
  3. مشاهده فایل کتابخانه Curved-Fab-Reveal یکی از عواملی که باعث جلب توجه کاربران به برنامه ای می شود استفاده از انیمیشن های جذاب و چشمگیر است. استفاده از انیمیشن در اندروید به برنامه ها شکل و شمایل حرفه ای می دهد و یکی از فاکتورهای اصلی و مهم در طراحی برنامه هایی با رابط کاربری قوی و یا باصطلاح کاربر پسند (User friendly) استفاده از انیمشین در برنامه های اندرویدی است.کتابخانه Curved-Fab-Reveal یکی از کتابخانه های جذاب به صورت انیمیشن و متریال بسیار زیبا. ارسال کننده Omid Zakeri ارسال ۱۷/۰۹/۲۰ دسته کتابخانه های اندروید  
  4. نگارش 1.0.0

    42 دانلود

    یکی از عواملی که باعث جلب توجه کاربران به برنامه ای می شود استفاده از انیمیشن های جذاب و چشمگیر است. استفاده از انیمیشن در اندروید به برنامه ها شکل و شمایل حرفه ای می دهد و یکی از فاکتورهای اصلی و مهم در طراحی برنامه هایی با رابط کاربری قوی و یا باصطلاح کاربر پسند (User friendly) استفاده از انیمشین در برنامه های اندرویدی است.کتابخانه Curved-Fab-Reveal یکی از کتابخانه های جذاب به صورت انیمیشن و متریال بسیار زیبا.

    رایگان

  5. یکی از عواملی که باعث جلب توجه کاربران به برنامه ای می شود استفاده از انیمیشن های جذاب و چشمگیر است. استفاده از انیمیشن در اندروید به برنامه ها شکل و شمایل حرفه ای می دهد و یکی از فاکتورهای اصلی و مهم در طراحی برنامه هایی با رابط کاربری قوی و یا باصطلاح کاربر پسند (User friendly) استفاده از انیمشین در برنامه های اندرویدی است.کتابخانه Curved-Fab-Reveal یکی از کتابخانه های جذاب به صورت انیمیشن و متریال بسیار زیبا. Curved-Fab-Reveal-Example-master.zip
  6. مشاهده فایل معرفی کتابخانه ShowcaseView کتابخانه (ShowcaseView ) برای برجسته سازی و نمایش بخش های خاص برنامه ها به کاربر با پوشش متمایز و جذاب طراحی شده است. این کتابخانه عالی است برای اشاره به نقاط مورد علاقه برای کاربران، حرکات، و یا موارد مبهم مفید است. ارسال کننده Omid Zakeri ارسال ۱۷/۰۹/۱۸ دسته کتابخانه های اندروید  
  7. نگارش 1.0.0

    8 دانلود

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

    رایگان

  8. متد سازنده ، متدی است هم نام کلاس که در هربار ايجاد نمونه‌اي جديد از آن كلاس، بصورت خودكار فراخواني مي‌گردد.هدف از متد سازنده مقدار دهی کردن اعضای کلاس در زمان ایجاد نمونه ای جدید از کلاس است. متد سازنده همیشه دارای سطح دسترسی public است. متد سازنده هیچ مقداری باز نمی گرداند حتی void هم نیست.اگر کلاسی متد سازنده نداشته باشد جاوا به صورت پیش فرض یک متد سازنده برای آن در نظر می گیرد. استفاده کردن از متد سازنده اجباری نیست.یک کلاس می تواند دارای چندین متد سازنده باشد. مثال1 : class Box { double width; double height; double depth; // This is the constructor for Box. Box() { System.out.println("Constructing Box"); width = 10; height = 10; depth = 10; } double volume() { return width * height * depth; } } class BoxDemo6 { public static void main(String args[]) { Box mybox1 = new Box(); Box mybox2 = new Box(); double vol; vol = mybox1.volume(); System.out.println("Volume is " + vol); vol = mybox2.volume(); System.out.println("Volume is " + vol); } } Output Constructing Box Constructing Box Volume is 1000.0 :مثال ۲ class Box { double width; double height; double depth; // This is the constructor for Box. Box(double w, double h, double d) { width = w; height = h; depth = d; } double volume() { return width * height * depth; } } class BoxDemo7 { public static void main(String args[]) { Box mybox1 = new Box(10, 20, 15); Box mybox2 = new Box(3, 6, 9); double vol; vol = mybox1.volume(); System.out.println("Volume is " + vol); vol = mybox2.volume(); System.out.println("Volume is " + vol); } } Output Volume is 3000.0 Volume is 162.0
  9. access modifier ها مشخص می نمایند که چه اطلاعات و داده هایی از یک کلاس برای کلاسهای دیگر قابل دسترس باشد. برای کلاسها وفیلدهاوConstructor ها و متدها می توان سطح دسترسی تعیین کرد. یکی از ویژگیهای برنامه نویسی شی گرایی کپسوله سازی می باشد که توسط Access Modifier ها قابل پیاده سازی است. انواع access modifier ها: ۱-public ۲-private ۳-default ۴-Protected public: اگر کلاسی public باشد از هر جایی می توان به آن دسترسی داشت. حتی اگر کلاسها درون پکیج های جدا از هم قرار داشته باشند هم باز قابل دسترسی خواهند بود. Private: کلاس ها و فیلد هایی که private هستند نمیتوانند توسط کلاس ها وinterface های دیگر به آنها دسترسی داشت. و فقط درون کلاس تعریف شده قابل دستیابی هستند. Default: اگر از هیچ access modifier ای هنگام تعریف کلاس ها و متد ها استفاده نکنیم جاوا حالتdefault را برای آن در نظر می گیرد که در این حالت این کلاس ها و متدها تنها توسط کلاس هایی که درون همان پکیج هستند قابل دسترسی می باشد.در واقع به این حالت package access modifier هم می گویند. Protected: این حالت همانند default می ماند با این تفاوت که sub class ها (یعنی کلاس هایی که از این کلاس ارث بری کردند)هم می توانند به این کلاس دسترسی داشته باشند. مثال: class Test { int a; // default access public int b; // public access private int c; // private access // methods to access c void setc(int i) { // set c's value c = i; } int getc() { // get c's value return c; } } class AccessTest { public static void main(String args[]) { Test ob = new Test(); // These are OK, a and b may be accessed directly ob.a = 10; ob.b = 20; // This is not OK and will cause an error // ob.c = 100; // Error! // You must access c through its methods ob.setc(100); // OK System.out.println("a, b, and c: " + ob.a + " " + ob.b + " " + ob.getc());class AccessTest { public static void main(String args[]) { Test ob = new Test(); // These are OK, a and b may be accessed directly ob.a = 10; ob.b = 20; // This is not OK and will cause an error // ob.c = 100; // Error! // You must access c through its methods ob.setc(100); // OK System.out.println("a, b, and c: " + ob.a + " " + ob.b + " " + ob.getc()); } } } } نکته :درون این برنامه به دلیل اینکه c به صورت private تعریف شده نمی توان مستقیم به آن دسترسی داشت برای دسترسی به این فیلد باید از متد های setc, getc استفاده نمود. کلمه کلیدی (this): گاهی اوقات متدها نیاز ارجاع به شیئی را دارند که آنها را فعال (ایجاد) کرده است به همین منظواز کلمه کلیدی this در جاوا استفاده می نماییم.با استفاده از this در هر متد می توان به شیء جاری ارجاع نمود.در متدها و متد سازنده (Constructor) از this استفاده می شود. برای درک بهتر موضوع به مثال زیر توجه نمایید: Box(double w, double h, double d) { this.width = w; this.height = h; this.depth = d; }
  10. پایگاه داده SQLite یکی از راه های ذخیره داده های برنامه شما به صورت محلی در اندروید است. در این پایگاه داده من میخوام به شما یک راه ساده تر بهنشان دهم. با استفاده از Sugar ORM . به طور معمول با استفاده از SQLite در اندروید، مقدار زیادی از کد های boilerplate مورد نیاز بوده که زمان قابل توجهی صرف می شود. اما با Sugar ORM، همه ی شما نیاز به یک مدل (Bean) دارید: (Add a new note (save : اضافه کردن Delete note : حذف کردن Modify : تغییرات در ابتدا کتابخانه زیر را اضافه کنید : compile 'com.github.satyan:sugar:1.4' تنظیمات زیر را وارد منیفست کنید: <application android:name="com.orm.SugarApp" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" > … <meta-data android:name="DATABASE" android:value="notes.db" /> <meta-data android:name="VERSION" android:value="1" /> <meta-data android:name="QUERY_LOG" android:value="true" /> <meta-data android:name="DOMAIN_PACKAGE_NAME" android:value="com.grafixartist.noteapp" /> </application> یک مدل (Bean) کلاس شما نیاز دارید که به صورت زیر باشد : public class Note extends SugarRecord { String title, note; long time; // Default constructor is important! public Note() { } public Note(String title, String note, long time) { this.title = title; this.note = note; this.time = time; } … // Getter setters here } برای Create کردن کد زیر را وارد کنید : Note note = new Note(title, desc, time); note.save(); برای Update کردن کد زیر را وارد کنید : Note note = Note.findById(Note.class, id); note.title = “updated title here"; note.save(); برای Delete کردن کد زیر را وارد کنید : Note note = Note.findById(Note.class, id); note.delete(); برای بدست آوردن فهرست همه لیست ها : List<Note> notes = Note.listAll(Note.class); Query برای این کار 2 راه برای انجام این کار وجود دارد. بیایید مثال را مقایسه کنیم: استفاده از Raw Query : List<Note> notes = Note.findWithQuery(Note.class, "Select * from Note where name = ?", "mynote"); استفاده از Query Builder : Select.from(Note.class) .where(Condition.prop("title").eq("mynote"), Condition.prop("description").eq("notedesc")) .list();
  11. کلاس Java FileInputStream بایت ورودی را از یک فایل دریافت می کند. این برای خواندن داده های بایت گرا (جریان های بایت خام) مانند داده های تصویری، صوتی، تصویری و غیره استفاده می شود. به مثال زیر توجه کنید: public class FileInputStream extends InputStream public class DataStreamExample { public static void main(String args[]){ try{ FileInputStream fin=new FileInputStream("D:\\testout.txt"); int i=fin.read(); System.out.print((char)i); fin.close(); }catch(Exception e){System.out.println(e);} } } توجه: قبل از اجرای کد، یک فایل متنی به نام "testout.txt" لازم است که ایجاد شود. در این فایل ما محتوای زیر را داریم: Welcome to javatpoint. اما خروجی کد بالا: Output: W خب برای خواندن همه ی کاراکترها میتوان از دستور do-while استفاده کرد : import java.io.FileInputStream; public class DataStreamExample { public static void main(String args[]){ try{ FileInputStream fin=new FileInputStream("D:\\testout.txt"); int i=0; while((i=fin.read())!=-1){ System.out.print((char)i); } fin.close(); }catch(Exception e){System.out.println(e);} } } Output: Welcome to javaTpoint
  12. در جاوا، ما کلاسهای استثنائی را مانند کلاس ArithmeticException، ArrayIndexOutOfBoundsException، NullPointerException و غیره تعریف کرده ایم. شرایط خاصی برای این استثنائات تعریف شده و در شرایطی که آنها به طور ضمنی توسط JVM (ماشین مجازی جاوا) استفاده می شوند وجود دارد. آیا می دانید که یک برنامه نویس می تواند یک استثنا جدید ایجاد کند و آن را به صراحت پرتاب کند؟ این استثنا ها به عنوان استثنائات تعیین شده توسط کاربر شناخته می شوند. به منظور استثنائات تعریف شده توسط کاربر، پرتاب کلمه کلیدی مورد استفاده قرار می گیرد. در این آموزش، ما خواهیم دید که چگونه یک استثناء جدید ایجاد کنیم و آن را در یک برنامه با استفاده از کلمه کلیدی پرتاب کنیم. شما همچنین می توانید یک استثناء قبلا تعریف شده ای مانند ArithmeticException، IOException و غیره استفاده کنید. //A void method public void sample() { //Statements //if (somethingWrong) then IOException e = new IOException(); throw e; //More Statements } صدا زدن متد نمونه بالا باید همیشه در یک بلوک امتحان قرار داده شود زیرا یک استثناء چک شده را پرتاب می کند - IOException. به کد زیر دقت کنید: MyClass obj = new MyClass(); try{ obj.sample(); }catch(IOException ioe) { //Your error Message here System.out.println(ioe); } استثنا در جاوا، اجباری از نوع Throwable است. اگر شما سعی می کنید که یک شی را پرتاب کنید، کامپایلر از کامپایل کردن برنامه خود اجتناب می کند و یک خطای کامپایل را نشان می دهد. هر گاه برنامه با یک دستور استثنا مواجه شود، مراحل بعدی اجرا نمی شود. کنترل بلافاصله برای گرفتن بلوک منتقل می شود تا ببینید آیا استثنائت پرتاب شده وجود دارد یا خیر. اگر استثنائی در آن وجود نداشته باشد، بلوک بلوک بعدی برای استثناء بررسی می شود و غیره. اگر هیچ کدام از بلوک های تکرار نشود، استثنائا پرتاب شده است، اما یک پیام استثنایی تولید شده بر روی سیستم روی صفحه نمایش داده می شود، همان چیزی است که ما برای استثنائات غیر دستی مدیریت می کنیم. class ThrowDemo{ public static void main(String args[]){ try{ char array[] = {'a','b','g','j'}; /*I'm displaying the value which does not * exist so this should throw an exception */ System.out.println(array[78]); }catch(ArithmeticException e){ System.out.println("Arithmetic Exception!!"); } } } Output: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 78 at beginnersbook.com.ThrowDemo.main(Details.java:9) از آنجا که استثنای پرتاب شده در بلوک های گیرنده مورد استفاده قرار نگرفت، سیستم تولید شده پیام استثنایی برای این استثنا خاص نمایش داده شد.
  13. در این مثال ما نشان خواهیم داد که چگونه از استثنائی try-catch استفاده کنیم. استثنا یک خطا است که ممکن است در طی اجرای یک برنامه اتفاق بیفتد و نشان می دهد که جریان طبیعی برنامه باید قطع شود. NullPointerException، IOException، ArithmeticException، ArrayIndexOutOfBoundsException، بعضی از موارد دیگر استثنائی است که معمولا دیده می شود. این استثنا ها می توانند توسط برخی از بلوک های کد مورد استفاده قرار گیرند که توسط اظهارات try-catch احاطه شده اند. این بلوک کد، handler استثناء نامیده می شود. همچنین، دستیار استثنا ممکن است به صورت اختیاری شامل بلوک نهایی باشد. مثلا کد زیر دارای خطای تقسیم بر صفر است: public class Testtrycatch1{ public static void main(String args[]){ int data=50/0;//may throw exception System.out.println("rest of the code..."); } } Output: Exception in thread main java.lang.ArithmeticException:/ by zero همانطور که در مثال بالا نشان داده شده است، بقیه کد اجرا نمی شود (در این حالت، بقیه دستور کد ... چاپ نمی شود). بیایید راه حل مشکل بالا را با بلوک try-catch جاوا ببینیم. public class Testtrycatch2{ public static void main(String args[]){ try{ int data=50/0; }catch(ArithmeticException e){System.out.println(e);} System.out.println("rest of the code..."); } } Output: Exception in thread main java.lang.ArithmeticException:/ by zero ...rest of the code حالا، همانطور که در مثال بالا نشان داده شده است، بقیه کد اجرا می شود یعنی بقیه دستور کد ... چاپ می شود.
  14. این کلمه‌ی کلیدی در مبحث thread مطرح می‌شود. وقتی چند thread با یک متغیر (مثلا یک شی) عادی کار می‌کنند، ممکن است آن را cache کنند. یعنی هر thread ای که این متغیر را cache کند، یک نسخه از آن گرفته و با آن کار می‌کند (تغییرات اعمالی بر روی آن توسط یک thread، به سایر thread ها منعکس نمی‌شود) اگر آن متغییر با کلمه‌ی کلیدی volatile تعریف شود، تنها یک نسخه از آن متغیر وجود دارد و تغییراتی که یک thread بر روی آن انجام می‌دهد، بلافاصله در thread های دیگر منعکس می‌شود. public class VolatileTest { private static final Logger LOGGER = MyLoggerFactory.getSimplestLogger(); private static volatile int MY_INT = 0; public static void main(String[] args) { new ChangeListener().start(); new ChangeMaker().start(); } static class ChangeListener extends Thread { @Override public void run() { int local_value = MY_INT; while ( local_value < 5){ if( local_value!= MY_INT){ LOGGER.log(Level.INFO,"Got Change for MY_INT : {0}", MY_INT); local_value= MY_INT; } } } } static class ChangeMaker extends Thread{ @Override public void run() { int local_value = MY_INT; while (MY_INT <5){ LOGGER.log(Level.INFO, "Incrementing MY_INT to {0}", local_value+1); MY_INT = ++local_value; try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } } } } output با استفاده از volatile ... Incrementing MY_INT to 1 Got Change for MY_INT : 1 Incrementing MY_INT to 2 Got Change for MY_INT : 2 Incrementing MY_INT to 3 Got Change for MY_INT : 3 Incrementing MY_INT to 4 Got Change for MY_INT : 4 Incrementing MY_INT to 5 Got Change for MY_INT : 5 output بدون استفاده از volatile ... Incrementing MY_INT to 1 Incrementing MY_INT to 2 Incrementing MY_INT to 3 Incrementing MY_INT to 4 Incrementing MY_INT to 5 نکته: استفاده از Volatile در برنامه هایی که تنها از یه Thread استفاده می شه کاربردی نداره…
  15. transient چیست؟ برای اینکه یک متغیر در عملیات serialization تبدیل و ارسال نشود آن را با کلمه کلیدی transient تعریف میکنند. عملیات Serialization چیست؟ وقتی قرار است کلاس ها در شبکه فرستاده شوند (مثلا در RMI) داده ها بصورت سریالی از بایت ها ارسال شده و دوباره در مقصد به شکل اول ساخته می شوند. به این عملیات Serialization می گویند و کلاس های مربوطه باید رابط Serializable را پیاده سازی کنند. کاربرد transient در زمینه Serialization می باشد و به این معنی هست که فیلد مورد نظر در عمل Serialization استفاده نشود، فیلد هایی رو transient می کنند که نمی خواهند آن ها را نگهداری کنند یا در انتقال شی ها در شبکه نیازی به انتقال اطلاعات آن ها نیست. مثلا اگر شما وضعیت لحظه ایه یک فرآیند را در یک فیلدی از یک شی نگهداری کنید در موقع ثبت و Serialization ممکن است دوست نداشته باشید آن فیلد را نگهداری کنید چون همیشه در زمان اجرا محاسبه میشود. public class Student implements Serializable{ int id; String name; transient int age;//Now it will not be serialized public Student(int id, String name,int age) { this.id = id; this.name = name; this.age=age; } } class PersistExample{ public static void main(String args[])throws Exception{ Student s1 =new Student(211,"omid",26);//creating object //writing object into file FileOutputStream f=new FileOutputStream("f.txt"); ObjectOutputStream out=new ObjectOutputStream(f); out.writeObject(s1); out.flush(); out.close(); f.close(); System.out.println("success"); } } Output: class DePersist{ public static void main(String args[])throws Exception{ ObjectInputStream in=new ObjectInputStream(new FileInputStream("f.txt")); Student s=(Student)in.readObject(); System.out.println(s.id+" "+s.name+" "+s.age); in.close(); } }
  16. RecyclerViewFastScroller یک ویجت است که می توان از آن برای پیمایش سریع استفاده کرد. RecyclerViewFastScroller-master.zip
  17. RecyclerView بسیار شبیه ListView در اندروید است. هر دو برای نمایش لیست در برنامه اندروید مورد استفاده قرار می گیرند، اما در بعضی موارد در مقایسه با یکدیگر تفاوت دارند. ListView در مقایسه با RecyclerView تا حدودی کندتر است. RecyclerView برخی از سفارشی سازی های اضافی را که ListView ارائه نمی کند فراهم می کند. RecyclerView در طراحی آیتم ها لیست ها در اندروید معرفی شده است. RecyclerView می تواند عملکرد نرم افزار را با بازیابی دیدگاه ها برای نمایش اقلام ردیف بهینه سازی کند، زیرا از هر نمایشگر برای نمایش هر آیتم لیست استفاده می کند که ListView هر بار که آیتم لیست قابل مشاهده است، نمای جدید را ایجاد می کند. ListView برخی از اقلام لیست را محدود می کند، در حالی که RecyclerView ابزار خاصی برای طراحی آیتم لیست فراهم می کند. ما همچنین می توانیم بگوییم که RecyclerView نسخه جدید ListView در اندروید است. ListView لیست سفارشی سازی لیست را با کمک منابع drawable فراهم می کند اما سفارشی سازی آن برای مثال محدود می شود. ما می توانیم از itemable برای item list که برای همه موارد در لیست استفاده می شود استفاده کنیم، نمی توانیم سفارشی سازی یک آیتم لیست خاص را ارائه دهیم. در حالی که ابزار ItemDecoration recyclerview، سفارشی کردن طراحی خاص و طرح بندی طرح برای یک آیتم لیست خاص را فراهم می کند. DividerItemDecoration verticalDecoration = new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.HORIZONTAL); Drawable verticalDivider = ContextCompat.getDrawable(getApplicationContext(), R.drawable.myshape); verticalDecoration.setDrawable(verticalDivider); recyclerView.addItemDecoration(verticalDecoration); DividerItemDecoration horizontalDecoration = new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL); Drawable horizontalDivider = ContextCompat.getDrawable(getApplicationContext(), R.drawable.myshape); horizontalDecoration.setDrawable(horizontalDivider); recyclerView.addItemDecoration(horizontalDecoration);
  18. برنامه شما می تواند یک برنامه دوربین را شروع و عکس گرفته شده را به عنوان یک نتیجه برگرداند. یا شما ممکن است برنامه دیگران را برای کاربری برای انتخاب مخاطب شروع کنید و جزئیات مخاطب را به عنوان نتیجه دریافت خواهید کرد.البته activity ای که پاسخ می دهد باید برای برگرداندن یک نتیجه طراحی شود. هنگامی که این را انجام می دهد، این نتیجه به عنوان یک شی مقصد دیگر ارسال می شود. activity شما آن را در پاسخ ()onActivityResult دریافت می کند. توجه : هنگام فراخوانی ()startActivityForResult از مفاهیم صریح یا ضمنی استفاده کنید. آغاز یک activity هیچ چیز ویژه ای در مورد شی ای که که با شروع یک activity برای یک نتیجه استفاده می کنید، وجود ندارد، اما شما نیاز به ارسال یک آرگومان عدد صحیح اضافی را به روش () startActivityForResultدارید. آرگومان صحیح یک "کد درخواست" است که درخواست شما را شناسایی می کند. هنگامی که شما نتیجه مورد نظر را دریافت می کنید، پاسخ کد درخواست به همان شکل که می تواند نتیجه را شناسایی و چگونگی اداره کردن آنرا تعیین کند، فراهم میکند. static final int PICK_CONTACT_REQUEST = 1; // The request code ... private void pickContact() { Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts")); pickContactIntent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST); } هنگامی که activity کاربر با activity های پس از آن و مقدار بازگشتی به اتمام می رسد، سیستم تابع onActivityResult() activity شما را فراخوانی می کند. این تابع شامل سه آرگومان است: - کد درخواستی که شما به ()startActivityForResult فرستاده اید . - کد نتیجه توسط activity دوم مشخص شده است.اگر عملیات موفقیت آمیز باشد این RESULT_OK و RESULT_CANCELED اگر کاربر خارج شود یا عملیات ناموفق باشد. - مقصودی که حامل داده های نتیجه می باشد. @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // Check which request we're responding to if (requestCode == PICK_CONTACT_REQUEST) { // Make sure the request was successful if (resultCode == RESULT_OK) { // The user picked a contact. // The Intent's data Uri identifies which contact was selected. // Do something with the contact here (bigger example below) } } }
  19. چگونه از Iterator استفاده کنیم ؟ Iterator زمانی استفاده می شود که شما می خواهید در یک چرخه به اجزای یک مجموعه دسترسی داشته باشد. برای مثال ممکن است که شما بخواهید از یک از اجزا را نشان دهید. ساده ترین راه این کار این است که از یک تکرار استفاده کنید.Iterator شما را قادر می سازد تا از طریق یک چرخه،عناصر مورد نظر را بگیرید یا حذف کنید. متدهایIterator : ( ) boolean hasNext = اگر عناصر بیشتری وجود داشته باشد true در غیر اینصورت false بر می گرداند. ( ) Object next = عنصر بعدی را بازمی گرداند اگر یک عنصر بعدی وجود نداشته باشد NoSuchElementException را برمی گرداند. ( ) void remove = عنصر فعلی را حذف می کند. در اینجا یک مثال از هر دو Iterator و ListIterator را نشان می دهید. که از ArrayList استفاده شده است، public class IteratorDemo { // Create an array list ArrayList al = new ArrayList(); // add elements to the array list al.add("C"); al.add("A"); al.add("E"); al.add("B"); al.add("D"); al.add("F"); // Use iterator to display contents of al System.out.print("Original contents of al: "); Iterator itr = al.iterator(); while(itr.hasNext()) { Object element = itr.next(); System.out.print(element + " "); } System.out.println(); // Modify objects being iterated ListIterator litr = al.listIterator(); while(litr.hasNext()) { Object element = litr.next(); litr.set(element + "+"); } System.out.print("Modified contents of al: "); itr = al.iterator(); while(itr.hasNext()) { Object element = itr.next(); System.out.print(element + " "); } System.out.println(); // Now, display the list backwards System.out.print("Modified list backwards: "); while(litr.hasPrevious()) { Object element = litr.previous(); System.out.print(element + " "); } System.out.println(); } Output: Original contents of al: C A E B D F Modified contents of al: C+ A+ E+ B+ D+ F+ Modified list backwards: F+ D+ B+ E+ A+ C+
  20. در این مقاله ما سعی می کنیم یک نمایشگر قفسه ای داشته باشیم که فهرستی از کتاب ها یا روزنامه ها و غیره را نشان می دهد. ابتدا در فایل xml. شما باید از ScrollView و TableLayout برای نمایش یک قفسه استفاده کنید. <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/sclView"> <TableLayout android:id="@+id/tblLayout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="0dp"> </TableLayout> </ScrollView> در TableLayout داخلی چند HorizontalScroll اضافه کنید که برابر با تعداد ردیف است. همچنین در هر TableRow داخلی یک image را وارد کنید. فراموش نکنید که یک تصویر قفسه برای پس زمینه ردیف تنظیم کنید: public class showShelfView extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); int numRow = 4; int numCol = 8; TableLayout tblLayout = (TableLayout) findViewById(R.id.tblLayout); for(int i = 0; i < numRow; i++) { HorizontalScrollView HSV = new HorizontalScrollView(this); HSV.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); TableRow tblRow = new TableRow(this); tblRow.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); tblRow.setBackgroundResource(R.drawable.bookshelf); for(int j = 0; j < numCol; j++) { ImageView imageView = new ImageView(this); imageView.setImageResource(R.drawable.book1); TextView textView = new TextView(this); textView.setText("Java Tester"); textView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); tblRow.addView(imageView,j); } HSV.addView(tblRow); tblLayout.addView(HSV, i); } } } توجه داشته باشید، ما TableRow و HorizontalScrollView را برابر با تعداد متغیر numRow مقایسه می کنیم. شما می توانید یک Dialog یا Editview برای مقدار ورودی استفاده کنید، سپس ردیف هایی با همان مقدار ایجاد کنید.
  21. ActiveAndroid یک ORM برای اندروید است. این یک مفهوم انتزاعی در SQLite است که به شما برای برقراری ارتباط با یک پایگاه داده در یک دستگاه بدون نیاز به نوشتن دستورات SQL کمک می کند. آبجکتی که از ActiveAndroid استفاده می کند با دستور زیر می تواند اطلاعات را در دیتابیس ذخیره کند: user.save(); و شما ب راحتی می توانید به جای استفاده از statement های زیاد در دیتابیس به صورت زیر عمل کنید: INSERT INTO Users (Nickname, Name, Address, City, PostalCode, Country) VALUES ('Zakeri','Omid','***','tehran','40000','iran'); مثال : بازیابی تمام user ها : List<User> users = new Select().from(User.class).execute(); ActiveAndroid یک راه خوب برای حذف بسیاری از کدهای مورد استفاده برای کار با پایگاه داده است. برای درک بهتر مفاهیم به ادرس زیر مراجعه کنید: http://www.activeandroid.com/ دانلود کتابخانه از سرور انجمن اندروید ایران pardom-ActiveAndroid-3.0-254-g08c6335.zip
  22. محدودیت ۶۵K متدها یکی از مشکلاتی است که کاربران با آن مواجه می شوند و multidexing به عنوان روشی برای این مشکل پیشنهاد شده است. Multidexing راه حلی بسیار خوبی از سوی گوگل است، راه اندازی multidex Multidexing یک راه حل کامل و همراه با مستندسازی های خوب است. به منظور بکارگیری multidex در پروژه پیشنهاد می شود که نگاهی به Android Developer site بیندازید، my Github نیز یک پروژه نمونه را برای آشنایی بیشتر در اختیار شما قرار می دهد. تاثیر multidex بر کارآیی اپلیکیشن در هنگام راه اندازی برخی از کلاس ها در بازه زمانی بین شروع اپلیکیشن و نمایش تمامی عکس ها توسط Proguard شناسایی نمی شوند در حالی که در فایل dex اصلی ذخیره شده اند. سوالی که مطرح می شود این است که چگونه از لود شدن این کلاس ها در حین راه اندازی اپلیکیشن مطلع شویم. خوشبختانه متدی به نام findLoadedClass در ClassLoader وجود دارد، کار لازم بررسی ران تایم پس از پایان راه اندازی اپلیکیشن می باشد. پس از آن هر کلاسی که در فایل dex دوم ذخیره شده و در حین راه اندازی اپلیکیشن بارگذاری می شود به فایل dex اصلی جابجا شده و نام کلاس در فایل multidex.keep افزوده می شود. استفاده از multindex در gradle برنامه : android { compileSdkVersion 21 buildToolsVersion "21.1.0" defaultConfig { ... minSdkVersion 14 targetSdkVersion 21 ... // Change 1: Enabling multidex support. multiDexEnabled true } ... } //Change 2: If your minSdkVersion is lower than 21 then add below dependency dependencies { compile 'com.android.support:multidex:1.0.0' ..... ..... } استفاده ار کلاس multindex : public class YouApplication extends MultiDexApplication { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } } در نهایت استفاده آن را در برنامه : <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android.multidex.myapplication"> <application ... android:name="android.support.multidex.MultiDexApplication"> ... </application> </manifest>
  23. نحوه کار با این تقویم به این صورت است : اول یک ابجکت ازش می سازیم... CalendarTool calendarTool = new CalendarTool(); برای بدست آوردن تاریخ شمسی... calendarTool.getIranianYear() calendarTool.getIranianMonth() calendarTool.getIranianDay() برای بدست آوردن تاریخ میلادی... calendarTool.getGregorianYear() calendarTool.getGregorianMonth() calendarTool.getGregorianDay() به صورت پیش فرض تاریخ روز ست می شود. حالا اگر بخوایم تغییری در تاریخ ایجاد کنیم : calendarTool.setIranianDate(yearPicker.getValue(), monthPicker.getValue(), dayPicker.getValue()); یا calendarTool.setGregorianDate(yearPicker.getValue(), monthPicker.getValue(),dayPicker.getValue()); CalendarTool.java