21 ارسال در این موضوع قرار دارد

[align=justify][rtl]در این قسمت از آموزش قصد ساخت یک اپلیکیشن فارسی  برای اندروید داریم، برای اینکار باید مراحل زیر را انجام دهید. برای فارسی نویسی باید کلاس PersianReshape.java رو اضافه کرد. برای اضافه کردن این کلاس باید ابتدا آن را دانلود کرده سپس در برنامه استفاده کرد. دقت کنید نام Package این کلاس در خط اول  را حذف کرده و نام پکیج برنامه تان را بجای آن قرار دهید تا خطایی رخ ندهد. [قبل از شروع مطالعه ادامه مطلب، ابتدا به عکس انتهای این مقاله نگاه کنید تا دید کلی از کاری که میخواهیم انجام دهیم را پیدا کنید.][/rtl]

[/align]

[align=justify]شروع پروژه[/align]

[align=justify]۱-ابتدا یک پروژه جدید میسازیم. File/New/Project و سپس از پنجره باز شده گزینه Android Project را انتخاب کنید.[/align]

[align=center]418x398http://www.kamalan.com/wp-content/uploads/2012/01/01.png[/img][/align]

[align=justify]سپس باید نام پروژه و حداقلAPI ی که برنامه ما آنرا پشتیبانی میکند، تعیین کنیم. مطابق شکل تنظیمات را انجام دهید.[/align]

[align=center]370x488http://www.kamalan.com/wp-content/uploads/2012/01/02.png[/img][/align]

[align=justify]۲-افزودن کلاس PersianReshape.java (این کلاس در سورس برنامه که در پایین برای دانلود قرار داده شده وجود دارد. برای برنامه های خودتان کافی است این کلاس را کپی و به برنامه خودتان منتقل کنید).[/align]

[align=center]550x337http://www.kamalan.com/wp-content/uploads/2012/01/03.png[/img][/align]

[align=justify]۳- layout اصلی برنامه را mail.xml قرار داده ایم و ساختار برنامه را در آن معرفی کرده ایم. قسمتی از ساختار برنامه را در شکل زیر ملاحظه میکنید (برای دیدن سایر قسمتها حتماً کد برنامه را از پایین همین مطلب دانلود کنید).[/align]

[align=center]468x543http://www.kamalan.com/wp-content/uploads/2012/01/04.png[/img][/align]

[align=justify]۴- سپس به res/values/string.xml رفته و مطابق شکل زیر stringهای برنامه را معرفی کرده ایم.[/align]

[align=center]476x307http://www.kamalan.com/wp-content/uploads/2012/01/05.png[/img][/align]

[align=justify]۵- بعد از معرفی منابع رشته (string) در مرحله قبل به فایل کد نویسی کلاس اصلی برنامه Farsi.java رفته و منابع را فراخوانی می کنیم (به برنامه معرفی میکنیم).[/align]

[align=center]550x509http://www.kamalan.com/wp-content/uploads/2012/01/06.png[/img][/align]

[align=justify]شرح :[/align]

[align=justify]۱-۵- ابتدا فونت خود را در مسیر asset و پوشه ایجاده شده font قرار میدهیم. برای نمونه از فونت BZar در این برنامه استفاده شده است. از دستور Typeface برای تعریف کردن فونت استفاده می شود.[/align]

[align=justify] 444x43http://www.kamalan.com/wp-content/uploads/2012/01/08.png[/img][/align]

[align=justify] ۲-۵- بعد باید ویجت خود را تعریف کنیم.[/align]

[align=justify] 460x22http://www.kamalan.com/wp-content/uploads/2012/01/081.png[/img][/align]

[align=justify] ۳-۵- سپس فونت را به ویجت نسبت می دهیم.[/align]

[align=justify]228x19http://www.kamalan.com/wp-content/uploads/2012/01/082.png[/img][/align]

[align=justify] ۴-۵- یک متغیر رشته ای تعریف کرده ، سپس محتویات ویجت را درون آن می ریزیم.[/align]

[align=justify]460x19http://www.kamalan.com/wp-content/uploads/2012/01/083.png[/img][/align]

[align=justify]۵-۵-سرانجام در خاصیت متن ویجت، کلاس PersianReshape را فراخوانی می کنیم و رشته قبل را بعنوان محتویات درون آن قرار می دهیم.[/align]

[align=justify]415x25http://www.kamalan.com/wp-content/uploads/2012/01/084.png[/img][/align]

[align=justify]۶-کد ویجت خروج :[/align]

[align=justify]Finish();[/align]

[align=justify]کار تمام است. میتوانید پروژه را بر روی ایمولاتور تست نمایید. تصویر خروجی برنامه مطابق شکل زیر است.[/align]

[align=justify]

Finish();
 

[rtl]  کار تمام است. میتوانید پروژه را بر روی ایمولاتور تست نمایید. تصویر خروجی برنامه مطابق شکل زیر است.[/rtl]

[/align]

[align=center]527x386http://www.kamalan.com/wp-content/uploads/2012/01/07.png[/img]

[align=justify]دانلود از آپلود سنتر انجمن پی سی دروید :

http://p30droid.com/Uploader/do.php?id=23

پسورد :

www.p30droid.com

 

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

سلام ممنون از این آموزش خوب

من طبق آموزش شما توی یه تاپیک دیگه دارم از فایل txt داده می خونم ، فایل txt هم از هر دو نوع uniqode و utf-8 گذاشتم و با این کلاس و روش شما سعی کردم داده فارسی رو نمایش بدم

اما فارسی ها نمایش داده نمیشه ، اشکال عجیب و غریب میاد به جاش ولی اعداد درسته .

ممنون میشم من و راهنمایی کنین

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

شما قسمتی از پروژه یا کدتون رو بزارید،تا مشکل رو بررسی کنم

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

سلام

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

package com.example.mashhadcinema;import java.io.DataInputStream;import java.io.IOException;import java.io.InputStream;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.View.OnClickListener;import android.view.View;import android.view.WindowManager;import android.widget.ImageButton;import android.widget.TextView;import android.graphics.Typeface;public class AboutUs extends Activity {private static final String DEBUG_TAG = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {	super.onCreate(savedInstanceState);	setContentView(R.layout.activity_aboutus);	getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,			 WindowManager.LayoutParams.FLAG_FULLSCREEN);	ImageButton BtnBack = (ImageButton)findViewById(R.id.BtnBack);	BtnBack.setOnClickListener(BtnBackOnClick);	InputStream iFile = getResources().openRawResource(R.raw.aboutus);	Typeface face = Typeface.createFromAsset(getAssets(), "font/TAHOMA.TTF");	try {		TextView helpText = (TextView) findViewById(R.id.TextShowData); 		helpText.setTypeface(face);		String strFile = inputStreamToString(iFile);       		helpText.setText(PersianReshape.reshape(strFile));	    } 	catch (Exception e) 	    {	Log.e(DEBUG_TAG, "InputStreamToString failure", e);	    }}public String inputStreamToString(InputStream is) throws IOException {       StringBuffer sBuffer = new StringBuffer();       DataInputStream dataIO = new DataInputStream(is);       String strLine = null;       while ((strLine = dataIO.readLine()) != null) {           sBuffer.append(strLine + "\n");       }       dataIO.close();       is.close();       return sBuffer.toString();   }private OnClickListener BtnBackOnClick = new OnClickListener() {	@Override	public void onClick(View arg0) {		// TODO Auto-generated method stub		LoadMainMenuActivity();	}};private void LoadMainMenuActivity(){	Intent intent = new Intent(this,AppMenu.class);	startActivity(intent);	AboutUs.this.finish();}}

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

خب معلومه حروف فارسی رو علامت ؟ میزاره،در یکی از پست ها نحوه خواندن فایل تکست بصورت فارسی را مثالش رو قرار دادم

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

میشه بگید توی کدوم پست ؟

هر چی میگردم پیدا نمی کنم

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

توی اون مثال شما آدرس فایل رو در sdcard دادین

File fileDir = new File("mnt/sdcard/zendeginame.txt");

حالا اگه من بخوام از همون raw تو خود پروژه بخونم باید اینجوری بنویسم ؟

File fileDir = new File(R.raw.aboutus);

این درسته ؟

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

من کدم رو تغییر دادم ، اما هیچ متنی نمایش نمیده

لطفا یه بررسی کنید ، واقعا لازمش دارم

protected void onCreate(Bundle savedInstanceState) {	super.onCreate(savedInstanceState);	setContentView(R.layout.activity_aboutus);	getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,			 WindowManager.LayoutParams.FLAG_FULLSCREEN);	ImageButton BtnBack = (ImageButton)findViewById(R.id.BtnBack);	BtnBack.setOnClickListener(BtnBackOnClick);	//InputStream iFile = getResources().openRawResource(R.raw.aboutus);	Typeface face = Typeface.createFromAsset(getAssets(), "font/TAHOMA.TTF");	//try {		TextView helpText = (TextView) findViewById(R.id.TextShowData); 		helpText.setTypeface(face);		//String strFile = inputStreamToString(iFile);       		//helpText.setText(PersianReshape.reshape(strFile));	 //} 	//catch (Exception e) 	  //  {	//Log.e(DEBUG_TAG, "InputStreamToString failure", e);	    //}		StringBuffer sBuffer = new StringBuffer();		try {			File fileDir = new File("../res/raw/aboutus.txt");			BufferedReader in = new BufferedReader(			   new InputStreamReader(	                      new FileInputStream(fileDir), "UTF8"));			String str;			while ((str = in.readLine()) != null) {			    System.out.println(str);			    sBuffer.append(str + "\n");			}			helpText.setText(sBuffer);	                in.close();		    } 		    catch (UnsupportedEncodingException e) 		    {				System.out.println(e.getMessage());		    } 		    catch (IOException e) 		    {				System.out.println(e.getMessage());		    }		    catch (Exception e)		    {				System.out.println(e.getMessage());		    }}public String inputStreamToString(InputStream is) throws IOException {	StringBuffer sBuffer = new StringBuffer();	DataInputStream dataIO = new DataInputStream(is);	String strLine = null;	while ((strLine = dataIO.readLine()) != null) {		sBuffer.append(strLine + "\n");	}	dataIO.close();	is.close();	return sBuffer.toString();}

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

مشکل من با این تابع حل شد

public static String readTextFile(Context ctx, int resId)   {       InputStream inputStream = ctx.getResources().openRawResource(resId);       InputStreamReader inputreader = new InputStreamReader(inputStream);       BufferedReader bufferedreader = new BufferedReader(inputreader);       String line;       StringBuilder stringBuilder = new StringBuilder();       try       {           while (( line = bufferedreader.readLine()) != null)           {               stringBuilder.append(line);               stringBuilder.append('\n');           }       }       catch (IOException e)       {           return null;       }       return stringBuilder.toString();   }

نحوه صدا زدن تایع

String data = readTextFile(this, R.raw.simorgh);		textview1.setText(data);

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

سلام یک سوال داشتم . سورس این برنامه و  PersianReshape.java را از کجا باید دانلود کنم

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

سلام من این برنامه را دانلود و آن را import کردم ولی تمام اکتیویتیهاش از خط اول که نام پکیج نوشته شده تا خطاهای دیگه eroor مید البته تا حالا برنامه های دیگه ای هم که import کردم error دارن چرا ؟؟؟

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

این مشکل از نسخه ADT هستش که روی اکلیپس نصب کردین میباشد، باید نسخه SDK و ADT یکسانی را نصب کنید تا مشکل برطرف گردد.

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

این مشکل از نسخه ADT هستش که روی اکلیپس نصب کردین میباشد، باید نسخه SDK و ADT یکسانی را نصب کنید تا مشکل برطرف گردد.

هر دو ورژن  22.0.1 هستن.!!

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
package activities;import java.io.BufferedReader;import java.io.DataInputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.List;import java.util.Scanner;import java.util.regex.Matcher;import java.util.regex.Pattern;import com.dukhtar.R;import android.app.Activity;import android.content.Context;import android.graphics.Typeface;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;public class search extends Activity {EditText txt_search;TextView txt_matn, txt_matn2;Button btn;public String fonts = "BZar.ttf";@Overrideprotected void onCreate(Bundle savedInstanceState) {	// TODO Auto-generated method stub	super.onCreate(savedInstanceState);	setContentView(R.layout.search);	txt_search = (EditText) findViewById(R.id.search);	txt_matn = (TextView) findViewById(R.id.txt_search);	txt_matn2 = (TextView) findViewById(R.id.txt_matn);	btn = (Button) findViewById(R.id.btn_search);	btn.setOnClickListener(new View.OnClickListener() {		@Override		public void onClick(View v) {			// TODO Auto-generated method stub			InputStream iFile = getResources().openRawResource(					R.raw.quizhelp);			try {				String text = txt_search.getText().toString();				String strFile = inputStreamToString(iFile);				int i = strFile.indexOf(text);				if (i == 0) {					Toast.makeText(getApplicationContext(), "Not Found",							Toast.LENGTH_LONG).show();				} else {					try {						int i2 = strFile.lastIndexOf(text);						if (i2 < 0-1) {							Toast.makeText(getApplicationContext(),									"Not Found", Toast.LENGTH_LONG).show();						} else {							String searching = strFile.substring(i, i + 5);							txt_matn.setText(searching);							Typeface face = Typeface.createFromAsset(getAssets(), "font/" + fonts									+ "");							txt_matn.setTypeface(face);							String str_lbl = (String) txt_matn.getText().toString();							txt_matn.setText(adapters.PersianReshape.reshape(str_lbl));							Toast.makeText(search.this, adapters.PersianReshape.reshape(str_lbl), 1).show();							String array = strFile.substring(i, i +20);							txt_matn2.setText(array);						}					} catch (Exception e) {						// TODO: handle exception						Toast.makeText(getApplicationContext(), "error",								Toast.LENGTH_LONG).show();					}				}			} catch (IOException e) {				// TODO Auto-generated catch block				Toast.makeText(getApplicationContext(), "Error",						Toast.LENGTH_LONG).show();				// e.printStackTrace();			}		}	});}public String inputStreamToString(InputStream is) throws IOException {	StringBuffer sBuffer = new StringBuffer();	DataInputStream dataIO = new DataInputStream(is);	String strLine = null;	while ((strLine = dataIO.readLine()) != null) {		sBuffer.append(strLine + "\n");	}	dataIO.close();	is.close();	return sBuffer.toString();}

این چرا اینجوریه؟

ارور نداره اما تبدیلش نمیکنه به فارسی.....یکی کمک کنه!

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

.

با سلام

سوال اول :

شما به جای :

"fonts/tahoma.ttf"

این کد رو نوشتید: 

"fonts/"+fonts+""

منظورتان چه بوده؟

----------

سوال دوم :

در بعضی از کدها، نام فونت، در بعضی پسوند فونت، و در بعضی دیگر، هم نام و هم پسوند را با حروف بزرگ نوشته اند، علت خاصی دارد. حروف کوچک و بزرگ تاثیری دارد؟

در کد من در قسمت getAssets() خطا می گیرد. چرا؟ این هم کد:

TextView myTextView = (TextView) rootView.findViewById(R.id.textView_top);Typeface myTypeface = Typeface.createFromAsset(getAssets(), "fonts/tahoma.ttf");myTextView.setTypeface(myTypeface);

آیا برای فونت در ابتدای اکتیویتی باید متغییری تعریف کرد؟

اشکال کد من در کجاست؟

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

مشکل من با این تابع حل شد

public static String readTextFile(Context ctx, int resId)   {       InputStream inputStream = ctx.getResources().openRawResource(resId);       InputStreamReader inputreader = new InputStreamReader(inputStream);       BufferedReader bufferedreader = new BufferedReader(inputreader);       String line;       StringBuilder stringBuilder = new StringBuilder();       try       {           while (( line = bufferedreader.readLine()) != null)           {               stringBuilder.append(line);               stringBuilder.append('\n');           }       }       catch (IOException e)       {           return null;       }       return stringBuilder.toString();   }

نحوه صدا زدن تایع

String data = readTextFile(this, R.raw.simorgh);		textview1.setText(data);

سلام دوست عزیز منم همین مشکل رو دارم می تونی راهنماییم کنی که دقیقا تو کلاسی که باز کردی چه کدایی رو نوشتی؟

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

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

مشکل من با قراردادن کد :

getActivity().getAssets()

به جای :

getAssets()

حل شد.

از دوستان خواهشمندم به دو سوال ساده من \اسخ دهند. ممنون

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

سلام

من می خواهم لیست ویو فارسی ساز کنم

[shcode=java]

        ListHome = getResources().getStringArray(R.array.list_arry_f);

        ListView lst = (ListView) findViewById(R.id.listView1);

        ArrayAdapter lstAdap =  new ArrayAdapter(

                this, android.R.layout.simple_list_item_1, ListHome);

        lst.setAdapter(lstAdap);

        lst.setOnItemClickListener(new OnItemClickListener() {

            @Override

            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,

                    long arg3) {

                // TODO Auto-generated method stub

               

            }

           

        });

       

        String str_lst = lst.getAdapter().toString();

        lst.????(persianReshape.reshape(str_lst));

       

[/shcode]

آخری خط، شماره 19 به جای علامت سوال چی کد لازم داره؟ از setText استفاده کردم بازم نشده!! حتی setAdapter امتحان کردم، متاسفانه درست نشد

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

ممنون

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

اندروید نسخه 3 به بالا از فارسی پشتیبانی می کنه و نیازی به فارسی سازی نیست ! 

اگر بخواید از نسخه زیر 3 استفاده کنید راه حل فارسی کردن ListView به این صورته که باید Adapter اونو سفارشی کنید ! در سایت stackoverflow کلی مثال برای این کار هست  لینک یکی از تاپیکشا رو گذاشتم!

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

برای ارسال نظر یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

برای اینکه بتوانید نظر ارسال کنید نیاز دارید که کاربر سایت شوید

ایجاد یک حساب کاربری

برای حساب کاربری جدید در انجمن ما ثبت نام کنید. عضویت خیلی ساده است !


ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید


ورود به حساب کاربری

  • مطالب مشابه

    • توسط Omid Zakeri
      این فریمورک مختص اندروید طراحی نشده ولی سبک بودن آن موجب شده‌است که بسیاری از برنامه نویسان از آن در برنامه‌های اندرویدی استفاده کنند. این فریم ورک جهت اتصالات JDBC وSpring و اندروید طراحی شده است.
       
       
      @DatabaseTable(tableName = "users") public class User { @DatabaseField(id = true) private String username; @DatabaseField private String password; public User() { // ORMLite needs a no-arg constructor } public User(String username, String password) { this.username = username; this.password = password; } // Implementing getter and setter methods public String getUserame() { return this.username; } public void setName(String username) { this.username = username; } public String getPassword() { return this.password; } public void setPassword(String password) { this.password = password; } }
    • توسط Omid Zakeri
      با آمدن ORM‌ها به دنیای برنامه نویسی، کار برنامه نویسی نسبت به قبل ساده‌تر و راحت‌تر شد. عدم استفاده کوئری‌های دستی، پشتیبانی از چند دیتابیس و از همه مهمتر و اصلی‌ترین هدف این ابزار "تنها درگیری با اشیا و مدل شیء گرایی" کار را پیش از پیش آسان‌تر نمود.
      در این بین به راحتی می‌توان چندین نمونه از این ORM‌ها را  نام برد مثل IBatis , Hibernate ,Nhibernate و EF که از معروفترین آن‌ها هستند.
      من در حال حاضر قصد شروع یک پروژه اندرویدی را دارم و دوست دارم بجای استفاده‌ی از Sqlitehelper، از یک ORM مناسب بهره ببرم که چند سوال برای من پیش می‌آید. آیا ORM ای برای آن تهیه شده است؟ اگر آری چندتا و کدامیک از آن‌ها بهتر هستند؟ شاید در اولین مورد کتابخانه‌ی Hibernate جاوا را نام ببرید؛ ولی توجه به این نکته ضروری است که ما در مورد پلتفرم موبایل و محدودیت‌های آن صحبت می‌کنیم. یک کتابخانه همانند Hibernate مطمئنا برای یک برنامه اندروید چه از نظر حجم نهایی برنامه و چه از نظر حجم بزرگش در اجرا، مشکل زا خواهد بود و وجود وابستگی‌های متعدد و دارا بودن بسیاری از قابلیت‌هایی که اصلا در بانک‌های اطلاعاتی موبایل قابل اجرا نیست، باعث می‌شود این فریمورک انتخاب خوبی برای یک برنامه اندروید نباشد.

      معیارهای انتخاب یک فریم ورک مناسب برای موبایل: 
      سبک بودن: مهمترین مورد سبک بودن آن است؛ چه از لحاظ اجرای برنامه و چه از لحاظ حجم نهایی برنامه سریع بودن: مطمئنا ORM‌های طراحی شده‌ی موجود، از سرعت خیلی بدی برخوردار نخواهند بود؛ اگر سر زبان هم افتاده باشند. ولی باز هم انتخاب سریع بودن یک ORM، مورد علاقه‌ی بسیاری از  ماهاست. یادگیری آسان و کانفیگ راحت تر. greenDAO-master.zip
    • توسط Omid Zakeri
      تا به حال نرم افزار های زیادی از قبیل توییتر(twitter) , گوگل پلاس (+google) , جیمیل (gmail)  را در اندروید دیده‌ایم که باswipe/pull down ( کشیدن صفحه به سمت پایین) محتوای خود را بروز میکنند . زمانی که صفحه را از بالا به پایین میکشیم یک محتوای جدیدی به ما نشان داده می‌شود یا اینکه محتوای قبلی بروزرسانی خواهد شد.  در این آموزش میخواهیم کار با SwipeRefreshLayout را آموزش دهیم. این لایه به ما کمک می‌کند که طراحی اصولی (material designn) و کاربر پسندی را در برنامه های خود داشته باشیم.
       
      در یک آموزش مختصر با ما باشید تا به طور ساده با  نحوه کار SwipeRefreshLayout (کشیدن صفحه به سمت پایین) آشنا شویم.
      این مثال نحوه ی Refresh(تازه سازی) کردن صفحه با استفاده از SwipeRefreshLayout را به شما نشان  میدهد.مراحل را طبق زیر دنبال کنید.
      1-با استفاده ار اندروید استودیو یک پروژه ی جدید با نام Swipe تحت بسته ی com.example.Swipeایجاد کنید. نحوه ی ایجاد پروژه ی جدید در بخش آموزشی ساخت اولین پروژه در اندروید استودیو توضیح داده شده است.
      2-
      محتوای فایل res/layout/activity_main.xml را مانند آنچه در ادامه آمده است تغییر دهید. 3-محتوای فایل اکتیویتی اصلی java/com.example.sendemail/MainActivity.java را به منظور اجرای کدهای دلخواه پس از انجام عمل swipe/pull downn (کشیدن صفحه به سمت پایین)مانند آنچه در ادامه آمده است تغییر دهید.
      محتوای زیر مربوط به فایل res/layout/activity_main.xml می باشد.
      <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/mySwipe" android:layout_width="match_parent" android:layout_height="match_parent" > <!-- کد خود را اینجا وارد کنید--> </android.support.v4.widget.SwipeRefreshLayout>   این لایه(بالا) از کتابخانه‌ی زیر است.  
       
      android.support.v4.widget
      در کد بالا ما لایه‌ی SwipeRefreshLayout را به عنوان لایه‌ی والد یا ریشه استفاده کرده ایم و درون آن می‌توانیم لایه ها و عناصر دیگر را به کار ببریم.
      به عنوان مثال میتوان به صورت زیر نوشت. <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/mySwipe" android:layout_width="match_parent" android:layout_height="match_parent" > <ScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:text="من یک متن هستم" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:gravity="center"/> </ScrollView> </android.support.v4.widget.SwipeRefreshLayout>  
      معمولا درون این لایه یک recyclerView  یا listView به کار می‌رود که در صورت تازه سازی (refresh) مقادیر آیتم ها دچار تغییر شوند(آیتم جدیدی  وارد لیست شده یا از آن حذف شود). همچنین این لایه می‌تواند به عنوان یک لایه ی فرزند ظاهر شود.
      حالا نوبت این است که در اکتیویتی (activity) خود این لایه را وصل کنیم و از آن استفاده کنیم.در زیر محتوای فایل java/com.example.location/MainActivity.java آورده شده است.
      package com.example.Swipe; import android.os.Bundle; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { SwipeRefreshLayout mySwipe; @Override protected void onCreate(Bundle savedInstanceState) { ;( super.onCreate(savedInstanceState ;( setContentView(R.layout.activity_main ;( mySwipe = (SwipeRefreshLayout) findViewById(R.id.mySwipe () mySwipe.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener { @Override () public void onRefresh{ //اعمالی را که میخواهیم هنگام تازه سازی انجام شود ;( mySwipe.setRefreshing(false } ;({ } }     داخل کد بالا ما با صدا زدن متد setOnRefreshListener با ورودی رابط (interface) OnRefreshListener می‌توان متد onRefresh را بازنویسی (override) کرده و داخل آن هر عملی که برای تازه سازی لازم است انجام داد. برای مثال زمانی که ما برنامه ای متصل به اینترنت داریم و میخواهیم با swipe کردن مقادیر را بروزرسانی کنیم در متد onRefresh میتوانیم وضعیت اتصال به اینترنت را چک کنیم و اگر متصل بود دیتا را از اینترنت دریافت کرده و مقادیر محتوای صفحه را بروزرسانی کنیم. در اخر کد با نوشتن mySwipe.setRefreshing(false) انیمیشن ایجاد شده را متوقف میکنیم.
      اگر در جایی از برنامه بخواهیم خاصیت swipe pull down و انیمیشن را غیر فعال کنیم میتوانیم از دستور setEnabled(false) استفاده کنیم.
    • توسط Omid Zakeri
      اپلیکیشن ها به طرق گوناگون با کاربران خود تعامل برقرار می کنند و استفاده از سرویس های موقعیت یاب نیز یکی از روش های رایج برای نمایش اطلاعات شخصی سازی شده به کاربر می باشد، بدین ترتیب اپلیکیشن می تواند با دنیای فیزیکی ارتباط برقرار کرده و به افزایش تعامل کاربر منجر شود. بسیاری از اپلیکیشن ها این قابلیت را مورد استفاده قرار می دهند، اما موضوع این مطلب آموزشی پرداختن به Geofences است که اغلب نادیده گرفته می شود.
      Geofence یک مجموعه فضای مجازی را بر روی یک منطقه جغرافیایی واقعی تعیین می کند. با ترکیب موقعیت قرارگیری کاربر با geofence perimeter امکان فهمیدن اینکه آیا کاربر در داخل یا خارج یک geofence قرار دارد و یا در حال ورود یا خروج از یک منطقه خاص است، ممکن می شود.
       

       
      یک اپلیکیشن دانشگاه را تصور کنید که می تواند شما را از همکاران و استادانی که در محوطه دانشگاه قرار دارند، اگاه سازد و یا اپلیکشن یک مرکز خرید بزرگ که به مشتریان خود هدیه می دهد، احتمالات دیگری نیز وجود دارند که می توان مورد بررسی قرار داد.
      در این مطلب آموزشی نحوه استفاده از geofence در اندروید را فرا خواهید گرفت،
       
      ابتدا باید مجوزها را در AndroidManifest وارد کنید.
      <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission. ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.INTERNET" />  
      Geofencing نیاز به سرویس API گوگل دارد.
      build.gridle خود را باز کنید و dependency را اضافه کنید.
      compile 'com.google.android.gms:play-services-location:8.4.0'  
      پیاده سازی Geofencing :
      ابتدا باید بررسی کنیم آیا این سرویس دارای سرویس های Google Play نصب شده است یا خیر.
      int resp = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this); if (resp == ConnectionResult.SUCCESS) { mGoogleApiClient = new GoogleApiClient.Builder(this) .addApi(LocationServices.API) .addConnectionCallbacks(connectionAddListener) .addOnConnectionFailedListener(connectionFailedListener) .build(); mGoogleApiClient.connect(); } else { Log.e(TAG, "Your Device doesn't support Google Play Services."); } برای گرفتن آخرین مکان شناخته شده، می توانیم از API GoogleServices خود استفاده کنیم.
      // Create the LocationRequest object mLocationRequest = LocationRequest.create() .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) .setInterval(10 * 1000) // 10 seconds, in milliseconds .setFastestInterval(1 * 1000); // 1 second, in milliseconds  
       
      دریافت موقعیت مکانی
      Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); if (location == null) { LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); } else { currentLatitude = location.getLatitude(); currentLongitude = location.getLongitude(); }  
       
      Location Listeners
      @Override public void onLocationChanged(Location location) { currentLatitude = location.getLatitude(); currentLongitude = location.getLongitude(); } Now we will add both Success and Fail Listeners. private GoogleApiClient.ConnectionCallbacks connectionAddListener = new GoogleApiClient.ConnectionCallbacks() { @Override public void onConnected(Bundle bundle) { } @Override public void onConnectionSuspended(int i) { } }; private GoogleApiClient.OnConnectionFailedListener connectionFailedListener = new GoogleApiClient.OnConnectionFailedListener() { @Override public void onConnectionFailed(ConnectionResult connectionResult) { } };  
       
      اضافه کردن Geofencing
      /** * Create a Geofence list by adding all fences you want to track */ public void createGeofences(double latitude, double longitude) { String id = UUID.randomUUID().toString(); Geofence fence = new Geofence.Builder() .setRequestId(id) .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT) .setCircularRegion(latitude, longitude, 200) // Try changing your radius .setExpirationDuration(Geofence.NEVER_EXPIRE) .build(); mGeofenceList.add(fence); }  
       
      ایجاد Geofencing Request
      private GeofencingRequest getGeofencingRequest() { GeofencingRequest.Builder builder = new GeofencingRequest.Builder(); builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER); builder.addGeofences(mGeofenceList); return builder.build(); }  
       
      افزودن PendingIntent
      private PendingIntent getGeofencePendingIntent() { // Reuse the PendingIntent if we already have it. if (mGeofencePendingIntent != null) { return mGeofencePendingIntent; } Intent intent = new Intent(this, GeofenceTransitionsIntentService.class); // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when // calling addGeofences() and removeGeofences(). return PendingIntent.getService(this, 0, intent, PendingIntent. FLAG_UPDATE_CURRENT); }  
       
      یجاد کلاس "GeofenceTransitionsIntentService" که اکستند می کند از  IntentService 
      public class GeofenceTransitionsIntentService extends IntentService { private static final String TAG = "GeofenceTransitions"; public GeofenceTransitionsIntentService() { super("GeofenceTransitionsIntentService"); } @Override protected void onHandleIntent(Intent intent) { GeofencingEvent geofencingEvent = GeofencingEvent.fromIntent(intent); if (geofencingEvent.hasError()) { Log.e(TAG, "Goefencing Error " + geofencingEvent.getErrorCode()); return; } // Get the transition type. int geofenceTransition = geofencingEvent.getGeofenceTransition(); if (geofenceTransition == Geofence.GEOFENCE_TRANSITION_ENTER){ showNotification("Entered", "Entered the Location"); } else if(geofenceTransition == Geofence.GEOFENCE_TRANSITION_EXIT) { showNotification("Exited", "Exited the Location"); } else { showNotification("Error", "Error"); } public void showNotification(String text, String bigText) { // 1. Create a NotificationManager NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE); // 2. Create a PendingIntent for AllGeofencesActivity Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingNotificationIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); // 3. Create and send a notification Notification notification = new NotificationCompat.Builder(this) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle(text) .setContentText(text) .setContentIntent(pendingNotificationIntent) .setStyle(new NotificationCompat.BigTextStyle().bigText(bigText)) .setPriority(NotificationCompat.PRIORITY_HIGH) .setAutoCancel(true) .build(); notificationManager.notify(0, notification); } }  
       
      **منبع**
       
       
       
       
       
       
       

    • توسط Omid Zakeri
      ActivityNotFoundException این خطا وقتی رخ میده که برنامه سعی کنه یک اکتیویتی که وجود نداره رو اجرا کنه. معمولا وقتی این خطا پیش میاد که فراموش می کنیم اکتیویتی ساخته شده رو به فایل منیفست اضافه کنیم.
       
      ClassCastException وقتی با خطای ClassCastException روبرو میشید، یعنی دارید سعی می کنید روی دو آبجکت که از دو نوع مختلف هستن یک عملیات رو انجام بدید. مثلا وقتی که می خواید یه مقدار عددی رو به یک استرینگ اضافه کنید. برای حل کردن این مشکل کافیه از طریق لوگ، خطی که خطا اونجا رخ داده رو پیدا کنید و متغیر ها رو از یک نوع کنید.
       
      Error converting byte to dex اگر به این مشکل بر خوردید، اول پروژه رو clean کنید ( Build > Clean Project ) و سپس اون رو بازسازی کنید ( Build > Rebuild Project ) و اگر همچنان با این مشکل روبرو شدید چک کنید که آیا پکیج هایی که در کلاس هاتون استفاده کردید با اسم پکیج هایی که توی فایل منیفست هستن یکی هستن یا نه.
       
      INSTALL_FAILED_INSUFFICIENT_STORAGE این پیغام خطا به معنی این هست که فضای کافی برای اجرای برنامه وجود نداره. اگر از شبیه ساز ها استفاده می کنید میتونید از طریق منوی مدیریت AVD در شبیه ساز مورد نظر فضای بیشتری رو به اون اختصاص بدید و اگر از موبایل واقعی استفاده می کنید بهترین کار پاک کردن برنامه های بی استفاده و پاک کردن کش گوشی هست.
       
      NullPointerException شاید معروف ترین خطا در برنامه نویسی جاوا NullPointerException باشه. این مشکل وقتی پیش میاد که یک آبجکت ایجاد شده باشه اما هیچ فضایی در حافضه به اون اختصاص داده نشده باشه (null)، یا به زبان ساده تر یک آبجکت ساخته میشه اما تعریف نمیشه. مثلا کد زیر باعث ایجاد همچین خطایی میشه
      Object obj; obj.toString();
      برای حل کردنش هم باید با استفاده از لوگ، آبجکتی که ساخته شده و تعریف نشده رو پیدا کرد و سپس مقدار دهیش کرد.
       
      R.layout.main Cannot Be Found / Cannot resolve symbol R راه حل این خطا هم مثل شماره ی ۳ کلین و بازسازی پروژست. البته گاهی انجام این کار برای یک بار مشکل رو حل نمیکنه. اگر با انجام دادن اونها ( حتی برای چندین بار) مشکل حل نشد بهتر هست کش رو پاکسازی کنید (File > Invalidate Caches / Restart ). اگر باز هم مشکل حل نشد پروژه رو چک کنید که فایل های لی آوت در کلاس ها درست استفاده شدن و در نهایت آخرین کار، ساختن یک پروژه ی جدید و انتقال کد ها به اونجاست.
       
      OutofMemoryError معمولا وقتی این خطا رخ میده که برنامه سعی می کنه از مقدار خیلی زیادی حافظه ی رم استفاده کنه. معمولا استفاده از فایل های bitmap با حجم بالا علت این خطا هست و کم کردن حجم اون معمولا مشکل رو حل می کنه.
       
      Only the original thread that created a view hierarchy can touch its views وقتی که یک UI رو بخواید از خارج از اون آپدیت کنید با همچین خطایی روبرو می شید. همیشه باید سعی بشه که از این کار پیشگیری کنید اما اگر مجبور هستید این کار رو انجام بدید از runOnUiThread  استفاده کنید.
       
      Too many field references وقتی برنامه بیشتر از ۶۵۵۳۶ رفرنس داشته باشه این پیغام نشون داده میشه. در اندروید فایل هایی که به اونها dex فایل ها گفته میشه وجود داره که بیشترین تعداد رفرنس ها در هر کدوم از اونها عدد بالا هست. روش بهتر کم کردن تعداد رفرنس هاست اما در موقع نیاز میشه از چند دکس فایل استفاده کرد.
       
      NetworkOnMainThreadException وقتی بخواید عملیاتی که مربوط به شبکه هست رو در ترد اصلی استفاده کنید با این پیام روبرو میشید. به طور کلی استفاده از عملیاتی که زمانبر هست توی ترد های اصلی با خطا روبرو میشه و راه حل هم استفاده از AsyncTask هست.
       
      Activity has leaked window that was originally added here اگر از دیالوگ ها توی برنامتون استفاده کرده باشید احتمالا با این خطا روبرو شدید. این مشکل وقتی پیش میاد که یک دیالوگ در اکتیویتی ساخته شده باشه اما با از بین رفتن اکتیویتی، اون از بین نره. برای این کار کافی هست در متد onDestroy مربوط به اکتیویتی دیالوگ رو دیسمیس کنید ( dialog.dismiss() )

  • دوره آموزشی اندروید ایران کانادا آموزش ویدئویی اندروید آموزش برنامه نویسی اندروید اندروید کاپ دوره آنلاین اندروید کتاب های آموزشی اندروید بسته آموزشی اندروید دوره برنامه نویسی اندروید آموزش Kotlin آموزش برنامه نویسی ios
  • فایل