برترین های انجمن

  1. Farzad Sarseifi

    Farzad Sarseifi

    مدیریت انجمن


    • امتیاز: پسندیدن (Likes)

      12

    • تعداد ارسال ها

      1,915


  2. شاهرخ جهان زاده

    شاهرخ جهان زاده

    توسعه دهنده اندروید


    • امتیاز: پسندیدن (Likes)

      11

    • تعداد ارسال ها

      30


  3. Omid Zakeri

    Omid Zakeri

    توسعه دهنده اندروید


    • امتیاز: پسندیدن (Likes)

      4

    • تعداد ارسال ها

      94


  4. a.khosroabadi

    a.khosroabadi

    مدیر انجمن


    • امتیاز: پسندیدن (Likes)

      4

    • تعداد ارسال ها

      191



Popular Content

Showing most liked content since ۱۷/۰۷/۲۳ in all areas

  1. 2 likes
    برای پیاده سازی اینکار باید در فایل مانیفست تگ زیر را اضافه کنید تا در صورتی کاربر در بخش Brower ها اپ شما را انتخاب کرد اطلاعات برای شما ارسال شود <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:host="example.com" android:pathPrefix="/someresource/" android:scheme="http" /> <data android:host="www.example.com" android:pathPrefix="/someresource/" android:scheme="http" /> </intent-filter> Here, scheme -> Protocol of particular site host-> Exact site url with WWW pathprefix - > Your site's sub path if available Now,
  2. 2 likes
    سلام... حتما تا حالا شده که گوشیتون رو جایی جا بذارید یا توی خونه گمش کرده باشید... یکی از مزیتهایی که در گوگل وجود داره این هست که میتونید با استفاده از لینک زیر محل تقریبی گوشی رو پیدا کنید: www.google.com/android/find خیلی راحت وارد اکانت gmail بشید و با طی کردن مراحل به سادگی میتونید محل گوشی رو پیدا کنید... علاوه بر اون گزینه هایی مثل به صدا در آوردن یک آهنگ حتی در حالتی که گوشی روی حالت سایلنت هست در اون وجود داره...
  3. 2 likes
    قبل از بحث درباره پیاده سازی Singleton، اجازه دهید یکسری سوالات پایه ای را مطرح کنیم و به آنها پاسخ دهیم. هدف استفاده از Singleton Pattern همانطور که از نام آن مشخص است، Singleton Pattern فقط اجازه می دهد یک نمونه از class ساخته شود. چه زمانی نیاز داریم که یک نمونه از کلاس ساخته شود؟ خیلی وقت ها نیاز است که فقط یک نمونه از یک کلاس ساخته شود. مثلاً وقتی که نمی خواهیم وضعیت شی تغییر کند و یا می خواهیم class را به صورت stateless نگه داریم. به عنوان مثال زمانی که می خواهید یکسری داده های master را یکجا بارگذاری کنید و اجازه دهید مصرف کنندگان داده به جای فراخوانی های متعدد، با ساخت یک نمونه از کلاس، یک فراخوانی به یک کلاس Singleton داشته باشند. در حالت کلی، در هر برنامه Enterprise پیچیده، می توان به کلاس های Repository و لایه Data Access به صورت Singleton نگاه کرد. درحالیکه معمولاً نمی خواهیم وضعیت در این لایه ها حفظ شود. از جمله مثال های دیگر می توان به بحث log گیری، تنظیمات (configuration)، Caching و غیره اشاره کرد که می توان آن ها را به صورت Singleton پیاده سازی کرد. چرا که نیاز به یک نقطه مرکزی و سراسری خواهیم داشت تا به این کلاس ها دسترسی داشته باشیم. گذشته از توضیحات فوق، دیده شده است که برخی از برنامه نویسان بی تجربه یکسری نمونه های اضافی می سازند که نه نتها باعث سربار حافظه می شوند، بلکه کارایی برنامه را تحت تاثیر قرار می دهند. چرا کلاس های static به دلایل مختلفی نباید از کلاس های static استفاده کنیم. برخی از این دلایل عبارتند از: · موارد مختلفی هست هست که می خواهید Interface ها را در یک کلاس پیاده سازی کنید (برای مثال پیاده سازی IOC- بعداً به توضیح IOC خواهم پرداخت) و به جای پیاده سازی کلاس به صورت static، آن را به صورت Singleton پیاده سازی می کنیم. · در صورت نیاز، می توانید از یک کلاس singleton به صورت پارامتر یک متد استفاده کنید درحالیکه نمی توان این کار را با کلاس static انجام داد. نکته مهم درباره کلاس های Singleton ایده وضعیت یک کلاس از آنجا نشآت گرفته است که شما نیاز دارید یکسری هماهنگی در محیط های چند نخی (multi-threaded enviroments) ایجاد کنید. اجازه دهید نگاهی به یک پیاده سازی ساده داشته باشیم. در اولین مثال، یک Singleton با Lazy loading پیاده سازی شده است و تا زمانیکه فراخواننده، متد GetInstance را برای اولین بار فراخوانی نکند، نمونه ایجاد نمی شود. public class SingletonClass { private static SingletonClass instance = null; private SingletonClass() { } public static SingletonClass GetInstance { get { if (instance == null) { instance = new SingletonClass(); } return instance; } } اجازه دهید مشکل هماهنگی، که در محیط های چند نخی با آن مواجه هستیم را بر طرف کنیم. برای همین منظور از یک مکانیزم دوقفله استفاده خواهیم کرد: private static SingletonClass instance = null; private static object lockMe = new object(); private SingletonClass() { } public static SingletonClass GetInstance { get { if (instance == null) { lock (lockMe) { if (instance==null) { instance = new SingletonClass(); } } } return instance; } } و در آخر، Singleton با مقداردهی اولیه static. لطفاً توجه داشته باشید .NET Framework ایمنی thread در زمان مقداردهی اولیه تضمین می کند و دیگر نیازی نیست نگران مسائل هماهنگی باشیم. اگر چه دیگر از مزایای Lazy loading اشیاء برخوردار نخواهیم بود. private static SingletonClass instance = new SingletonClass(); public SingletonClass() { } private static SingletonClass GetInstance { get { return instance; } }
  4. 2 likes
    دقیقا مشکل شما از همینجا هستش، دقت کنید که در طراحی گرافیکی حتما از آیکون با حجم مناسب استفاده کنید، چون 50 کیلوبایت برای آیکون یکم زیاده... از لینک پایین میتونید آیکونهای مورد نیازتون رو بدست بیارید: https://materialdesignicons.com/ در غیر این صورت باید به شکل مناسب اونها رو طراحی کنید تا هم حجم اپ بیاد پایین و هم دچار این چنین مشکلاتی نشید... در هر صورت اگر موفق به انجام کار بالا نشدید در فایل مانیفست و در بخش application کدهای زیر رو وارد کنید: android:largeHeap="true" android:hardwareAccelerated="false"
  5. 2 likes

    نگارش 1.0.0

    10 دانلود

    دیگه لازم نیست بنویسی خودش برات مینویسه فقط بگو چی بنویسه شما با این برنامه تایپ صوتی میتونید به راحتی بنویسید ویژگی های اپلیکیشن: 1-فهم انواع جملات طولانی و بلند 2-دادن پیشنهاد برای تایپ بهتر 3-توانایی تشخیص دو زبان فارسی و انگلیسی 4امکان کپی متن این برنامه به سرور های قدرتمند گوگل متصل است و نیازمند اینترنت است

    رایگان

  6. 1 like
    سلام شما باید یک کوئری ادیتور بنویسید که بر اساس فیلد هایی که مقدار گرفتن قسمت where کوئری رو بسازه. منطقی ترین روش این هستش برای مثال private String getCondition(Map<String , Object> params){ StringBuilder condition = new StringBuilder(); if(params.get("name")) condition.append(" NAME=")+params.get("name").toString()+" And "; if(params.get("family")) condition.append(" FAMILY=")+params.get("family").toString()+" And "; if(condition.contain("AND") condition.substring(0,condition.lasIndexOf("And")); if(condition.length()>0) condition.insert(0 , " where "); return condition; } البته این یه نمونه خیلی کوچک و ساده بود و البته به زبان جاوا. میتونید از همچین روشی استفاده کنید
  7. 1 like
    در اندروید Repository management توسط Gradle انجام میگیرد. این اروری که اتفاق افتاده است برای این میباشد که کتابخانه مورد نظر وجود ندارد تا از نسخه کش شده استفاده کن و باید حتما آن را دانلود نمایید برای دانلود : 1- Gradle خود را آنلاین کنید 2- یک وی پی ان اجرا کنید 3- گزینه Sync Gradle را انتخاب کنید تا کتابخانه دانلود شود
  8. 1 like
    برای اینکه بتوانید که تمامی سایزها را پشتیبانی کنید بدون اینکه بهم ریختگی داشته باشید.باید برای سایز های مختلف طراحی کنید layout layout-sw600dp تبلت 7 اینچ layout-sw720dp تبلت 10 اینچ
  9. 1 like
    آیا برای Layout های خود برای سایز های زیر نیز طراحی کرده اید؟ layout-sw600dp layout-sw720dp
  10. 1 like
    چون تعداد اکتیویتی ها زیاد هست، بهتره برای بالا بردن سرعت اپلیکیشن یک فایل جاوای مجزا بسازید و بعد اون رو فراخوانی کنید... به شکل زیر: import android.app.Service; import android.content.Context; import android.content.Intent; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.os.IBinder; import android.util.Log; public class Tracker extends Service implements LocationListener { private final Context mContext; boolean isGPSEnabled = false; boolean isNetworkEnabled = false; boolean canGetLocation = false; Location location; double latitude; double longitude; private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 100; private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 10; protected LocationManager locationManager; public Tracker(Context context) { this.mContext = context; getLocation(); } public Location getLocation() { try { locationManager = (LocationManager) mContext .getSystemService(LOCATION_SERVICE); isGPSEnabled = locationManager .isProviderEnabled(LocationManager.GPS_PROVIDER); isNetworkEnabled = locationManager .isProviderEnabled(LocationManager.NETWORK_PROVIDER); if (!isGPSEnabled && !isNetworkEnabled) { } else { this.canGetLocation = true; if (isNetworkEnabled) { locationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); if (locationManager != null) { Criteria criteria = new Criteria(); location = locationManager.getLastKnownLocation(locationManager.getBestProvider(criteria,false)); if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); } } } if (isGPSEnabled) { if (location == null) { locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); if (locationManager != null) { Criteria criteria = new Criteria(); location = locationManager.getLastKnownLocation(locationManager.getBestProvider(criteria,false)); if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); } } } } } } catch (Exception e) { e.printStackTrace(); } return location; } public double getLatitude(){ if(location != null){ latitude = location.getLatitude(); } return latitude; } public double getLongitude(){ if(location != null){ longitude = location.getLongitude(); } return longitude; } public boolean canGetLocation() { return this.canGetLocation; } @Override public IBinder onBind(Intent intent) { return null; } @Override public void onLocationChanged(Location location) { } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } } و بعد در هر اکتیویتی که خواستید با دستور زیر اون رو فراخوانی کنید: //Global object... Tracker tracker; ... ... ... //In onCreate method... tracker = new Tracker(getContext().getApplicationContext()); if (tracker.canGetLocation()){ double curLat = tracker.getLatitude(); double curLong = tracker.getLongitude(); CameraPosition cameraPosition = new CameraPosition.Builder().target(new LatLng(curLat, curLong)).zoom(16).build(); googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); } else { //do what ever for example make a Toast... }
  11. 1 like
    من الان از پلتفرم معروف parse server که در واقع فیسبوک معرفی کرده و بیش از 500 میلیون اپ از اون استفاده می کردن، استفاده می کنم(parseplatform.org). می خواستم بدونم آیا کسی میدونه چه مقدار زمان میبره اون رو روی سرور های مجازی ایرانی مثل parspack پیاده سازی کرد؟ گویا شدنی هست و در سایتش نوشته آن را می توان در هر زیرساختی که بتونه node.js رو پشتیبانی کنه پیاده کرد. توضیح : فعلا برای اجرای parse server از sashido استفاده می کنم که همه کارها رو خودش انجام میده( کمتر از پنج سایت این قابلیت رو دارن) ولی به دنبال سرور عادی و ایرانی ام. با تشکر لینکها : parseplatform.org https://github.com/parse-community/parse-server http://docs.parseplatform.org/parse-server/guide/
  12. 1 like
    محققان اخیراً راه تازه ای برای دسترسی به محتویات موبایل هایی که از قفل های مبتنی بر الگوهای تصویری بهره مند هستند یافته اند. با استفاده از یک الگوریتم دید کامپیوتری، امکان دنبال کردن حرکات انگشت کاربر روی نمایشگر دستگاه مهیا می شود و بعد از آن، یک نرم افزار می تواند الگوی تعیین شده برای قفل دستگاه را در کمتر از 5 تلاش تشخیص دهد. قفل های مبتنی بر الگو، معمولاً از نقاط مشخصی روی نمایشگر بهره می برند که کاربر با متصل کردن آنها به یکدیگر به روشی منحصر به فرد، می تواند به موبایل خود دسترسی داشته باشد. این متود، محبوبیت بسیار زیادی دارد و تخمین زده شده که 40 درصد از کاربران اندرویدی به جای بهره گیری از PIN یا رمز عبور، به استفاده از آن روی آورده اند. نتایج تحقیق اخیر طی همکاری مشترکی میان دانشگاه لنکستر، دانشگاه بث و دانشگاه نورث وست چین به دست آمده که از موبایل های هوشمند کاربران هنگام کشیدن الگو برای باز کردن قفل دستگاه فیلم برداری کرده اند. محققان با آزمایش 120 الگوی منحصر به فرد که توسط 215 کاربر ایجاد شده بودند، پی بردند که نرم افزار مورد اشاره می تواند در 95 درصد از مواقع، الگو را در کمتر از 5 تلاش تشخیص دهد. گفته می شود که این روند، حتی هنگامی که دوربین قادر به مشاهده نمایشگر دستگاه نیست نیز عمل می کند. ضمناً نکته جالب اینجاست که هرچه الگوها پیچیده تر می شوند، تشخیص آنها با سهولت بیشتری صورت می گیرد. اکثر کاربران اندرویدی از امنیت پایین تر الگوها نسبت به پین کدها و رمزهای عبور آگاهی دارند و این مسئله، هنگام انتخاب روش قفل دستگاه نیز به آنها یادآوری می شود. علاوه بر این، استفاده از دوربین و نرم افزاری برای تشخیص الگوها، ممکن است اندکی پیچیده به نظر می رسد، چرا که گاهی امکان مشاهده پنهانی الگو کاربر و به خاطر سپردن آن نیز وجود دارد؛ با این همه محققان همواره به دنبال کشف آسیب پذیری های قفل امنیتی دستگاه های اندرویدی بوده اند.
  13. 1 like
    سلام سعی کنید log رو نگاه کنید ببنید چه پیغامهایی رو به شما نشون میده... زمانی که از slider layout استفاده میکنید بجای array از HashMap استفاده کنید... mDemoSlider = (SliderLayout)findViewById(R.id.slider); HashMap<String,String> url_maps = new HashMap<String, String>(); url_maps.put("Hannibal", "http://static2.hypable.com/wp-content/uploads/2013/12/hannibal-season-2-release-date.jpg"); url_maps.put("Big Bang Theory", "http://tvfiles.alphacoders.com/100/hdclearart-10.png"); url_maps.put("House of Cards", "http://cdn3.nflximg.net/images/3093/2043093.jpg"); url_maps.put("Game of Thrones", "http://images.boomsbeat.com/data/images/full/19640/game-of-thrones-season-4-jpg.jpg"); for(String name : url_maps.keySet()){ TextSliderView textSliderView = new TextSliderView(this); // initialize a SliderLayout textSliderView .description(name) .image(url_maps.get(name)) .setScaleType(BaseSliderView.ScaleType.Fit) .setOnSliderClickListener(this); mDemoSlider.addSlider(textSliderView); } mDemoSlider.setPresetTransformer(SliderLayout.Transformer.CubeIn); mDemoSlider.setPresetIndicator(SliderLayout.PresetIndicators.Center_Bottom); mDemoSlider.setCustomAnimation(new DescriptionAnimation()); mDemoSlider.setDuration(4000); لینک پیشنهادی: https://github.com/HKMOpen/NicePicPlay
  14. 1 like
    1. Code Snippets For java.util.Date, just create a new Date() DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); Date date = new Date(); System.out.println(dateFormat.format(date)); //2016/11/16 12:08:43 For java.util.Calendar, uses Calendar.getInstance() DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); Calendar cal = Calendar.getInstance(); System.out.println(dateFormat.format(cal)); //2016/11/16 12:08:43 For java.time.LocalDateTime, uses LocalDateTime.now() DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"); LocalDateTime now = LocalDateTime.now(); System.out.println(dtf.format(now)); //2016/11/16 12:08:43 For java.time.LocalDate, uses LocalDate.now() DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd"); LocalDate localDate = LocalDate.now(); System.out.println(dtf.format(localDate)); //2016/11/16
  15. 1 like
    دوستان مشکل حل شد. با gps provider راحت میشه اینکارو کرد، با تابع get time() در ضمن اگه راه حل دیگه ای هم غیر این هست، عنوان کنید ممنون میشم.
  16. 1 like
    سلام، اطلاعاتی که جناب مهندس سرسیفی ارائه کردن کاملا درست هست و حدس من اینه که شما به نسبت نیازتون کدها رو تغییر ندادید... که البته این کار نیاز به مقداری تجربه و دانش در زمینه برنامه نویسی داره، من خودم از همین دستور العمل استفاده میکنم البته با اندکی تغییر، مثلا در کلاس BaseBackPressedListener میتونید متد doBack رو به شکل زیر تغییر بدید: @Override public void doBack (){ if (!activity.getSupportFragmentManager().popBackStackImmediate()){ activity.supportFinishAfterTransition(); } } در کلاس MainActivity باید متد setOnBackPressedListener رو پیاده سازی کنید، که به این صورت میتونید این کار رو انجام بدید: public void setOnBackPressedListener(OnBackPressedListener onBackPressedListener){ this.onBackPressedListener = onBackPressedListener; } و بعد با استفاده کردن از یه متد در کلاس فرگمنت عمل پیاده سازی دکمه برگشت رو انجام‌بدید: public void manageOnBackPressed (){ ((MainActivity) getActivity()).setOnBackPressedListener(new BaseBackPressedListener(getActivity()){ @Override public void doBack(){ if (/*what ever*/){ //what ever } else { super.doBack(); } } و بعد در بخش onCreateView مربوط به فرگمنت متد ()manageOnBackPressed رو قرار بدید...
  17. 1 like
    حتما باید توجه کنید داشته باشید دستور super.onBackPressed(); را بعد از چک کردن دستوری که میخواهید اجرا شود قرار دهید
  18. 1 like
    متد OnBackPressed روی اکتیویتی پیاده سازی میشود با این روش میتوانید مشکل رو حل کنید 1-یک کلاس interface ایجاد کنید public interface OnBackPressedListener { public void doBack(); } 2-در این مرحله یک کلاس ایجاد کنید برای مدیریت back که در ادامه برای فرگمنت مورد استفاده قرار میگیرد public class BaseBackPressedListener implements OnBackPressedListener { private final FragmentActivity activity; public BaseBackPressedListener(FragmentActivity activity) { this.activity = activity; } @Override public void doBack() { activity.getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); } } 3- در داخل اکتیویتی زیر کلاس زیر را فراخوانی کنید protected OnBackPressedListener onBackPressedListener; 4-در متد OnBackPressed کلاس onBackPressed را برای کلید back قرار میدهیم @Override public void onBackPressed() { if (onBackPressedListener != null) onBackPressedListener.doBack(); else super.onBackPressed(); 5- در مرحله آخر درداخل فرگمنت کلید back را که در اکتیویتی ایجاد کرده بودیم را به فرگمنت ارجاع میدهیم @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { activity = getActivity(); ((BaseActivity)activity).setOnBackPressedListener(new BaseBackPressedListener(activity)); View view = ... ; //stuff with view return view; }
  19. 1 like
    این کلمه‌ی کلیدی در مبحث 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 استفاده می شه کاربردی نداره…
  20. 1 like
    سلام دوست عزیز خوب مشکلتون مشخصه شما تو این قسمت int fragment_number; int a = fragment_number; فقط اومدین دوتا متغییر تعریف کردین ولی هیچ مقداری بهش ست نکردین و خوب مسلما این قسمت همیشه خالی هستش. چون نه از جایی مقدار گرفته نه مربوط به یک کلاس یا اینترفیس دیگه هستش که مقدار داشته باشه.صرفا یک متغییر محلی خالی. ولی قسمت پایین شما اومدین متد showName رو override کردین که میاد مقدار name که بهش میدین میگیره و به fragment_number میده. کد شما به درستی داره کار میکنه از لحاظ منطقی. هدف شما از این که به این صورت نوشتین چی بوده و قرار بوده چه کاری انجام بدین؟
  21. 1 like
    سلام دوست عزیز با چیزی که شما تعریف کردین و من متوجه شدم بهترین گزینه ذخیره اطلاعات سمت سرور هستش به چند دلیل 1- همیشه جدیدترین بوتیک های اضافه شده در دسترس هستش 2- ممکنه شما بخواهید گزینه های دیگه ای هم اضافه کنید بعدا که انلاین بودن بهتون کمک میکنه.ذخیره شدن دیتا ها روی گوشی به نظر کار چندان جالبی نمیاد البته گاهی وقتا مجبورین برای بعضی قسمت ها این کارو بکنید و یکسری دیتا های کوچیکو نگه دارین. ولی همه چی سمت سرور باشه خیلی بهتر هستش.
  22. 1 like
    دوستان مشکل این قسمتو پیدا کردم مشکل در اسپیسی بود ک در قسمت insert مقادیر ب بعضی از فیلدها داده بودم.در کوئری زیر اگه دقت کنید سه تا فیلد name , year,clock ک داخل تک کوتیشن هستن یک اسپیس خوردن. $sql="insert into tbl_lesson (name_lesson,code_lesson, name_class, day, clock, college, semester, year,cycle,user_mobile) VALUES (' $name', '$code', '$clas', '$day', ' $clock', '$college', '$semester', ' $year','$cycle','$mobile')"; اینا با یک فاصله در دیتابیس ذخیره میشدن و موقع select گرفتن این فاصله رو لحاظ نمیکردم و باعث میشد ک رکوردی برنگردونه. اسپیس رو برداشتم مشکل حل شد
  23. 1 like
    مشکل مموری هستش.. تعداد آیتم های لیست ویو چند تا میباشد؟ یکی از مشکلات لیست ویو این میباشد که بیشتر از 200 ایتم را نمی تواند نمایش دهد
  24. 1 like
    فکر میکنم نیاز به یک دیتابیس داشته باشید حالا از هر مدلی که دوست داشتید، اگر فقط یکبار موقعیت رو میخواید ذخیره کنید یا به قولی تعداد محدود هست از Shared Preferences استفاده کنید در غیر این صورت از sqlite...
  25. 1 like
    سلام، توی متد زیر: public void onCreate(SQLiteDatabase db) { String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "(" + KEY_ID + " INTEGER PRIMARY KEY," + KEY_BRAND + " TEXT," + KEY_WORKED + " TEXT," + KEY_MODEL + " TEXT " + ")"; db.execSQL(CREATE_CONTACTS_TABLE); } بعد از پرانتزی که توی قسمت آخر بعد از پرانتز یه سمیکالن جا افتاده شاید بخاطر اون باشه. باید به شکل زیر نوشته بشه: public void onCreate(SQLiteDatabase db) { String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "(" + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + KEY_BRAND + " TEXT," + KEY_WORKED + " TEXT," + KEY_MODEL + " TEXT " + ");"; db.execSQL(CREATE_CONTACTS_TABLE); } البته برای قسمت KEY_ID هم بد نیست یه AUTOINCREMENT اضافه کنید...
  26. 1 like
    برنامه پزشک خانواده همه ما باید به فکر سلامتی خود باشیم و در این راه از هیچ تلاشی دریغ نکنیم. هرچند در موقع بیماری با مراجعه به پزشک میتوان مشکل را رفع نمود اما به قول معروف، پیشگیری بهتر از درمان است. بدین منظور نیاز به منابعی داریم که درباره خواص درمانی انواع گیاهان و یا نحوه مصرف داروها اطلاعات بدست آوریم و همچنین شیوه تغذیه سالم را بیاموزیم. خوشبختانه در حال حاضر این منابع به تعداد زیاد یافت میشوند و میتوانیم به راحتی از آنها استفاده کنیم. امروزه یکی از بهترین منابعی که به راحتی در دسترس همه مردم قرار دارد، تلفن همراه و تبلت است که میتواند به عنوان منبع ارزشمند و سهل الوصول اطلاعات مورد استفاده قرار بگیرد. در همین راستا، به معرفی نرم افزار ایرانی پزشک خانواده می پردازیم، که یکی از بهترین و کاملترین مراجع اطلاعاتی در حوزه سلامت، بهداشت و پزشکی میباشد. نرم افزار موبایل پزشک خانواده که برای سیستم عامل اندروید طراحی شده، در واقع مجموعه بسیار ارزشمندی از 15 برنامه کامل است که همگی در یک نرم افزار و با حجم بسیار پایین قرار داده شده اند. برنامه پزشک خانواده دارای 3 بخش اصلی است: 1. خواص خوراکی ها 2. دارو و درمان 3. اطلاعات پزشکی هر کدام از بخش های ذکر شده شامل مجموعه اطلاعات بسیار ارزشمندی هستند که در اداکمه به معرفی آنها می پردازیم. بخش خواص خوراکیها دارای مجموعه های عرقیات گیاهی، دمنوش ها، شربت ها و خواص میوه ها و گیاهان می باشد. 1. عرقیات گیاهی: شامل اطلاعات کامل، ویژگیها و خواص تعداد 74 عرق گیاهی. 2. دمنوشها: شامل اطلاعات کامل، ویژگیها، خواص و روش تهیه تعداد بیش از 100 دمنوش گیاهی شناخته شده. 3. شربتها: شامل اطلاعات کامل، ویژگیها، خواص و روش تهیه تعداد 60 شربت سنتی شناخته شده ایرانی. 4. گیاهان: شامل اطلاعات کاملی از خواص، مزایا و عوارض مصرف 455 میوه و گیاه شناخته شده که تصاویر با کیفیت و مناسبی از تمام این گیاهان نیز در نرم افزار گنجانده شده تا براحتی بتوان گیاه مربوطه را شناسایی نمود. این بخش، بدون شک یکی از کاملترین مجموعه های اطلاعات گیاهی است که تا کنون در کشور ایران طراحی شده است. بخش دارو و درمان دارای مجموعه های اطلاعات دارویی، داروهای گیاهی، نسخه و درمان، طب سنتی و طب اسلامی می باشد. 5. داروها: این قسمت شامل خواص، عوارض، شیوه مصرف، میزان مصرف و کلیه اطلاعات موجود در مورد 1392 داروی پر مصرف در کشور ایران است. همچنین نوع، ابعاد، شرکت تولید کننده و شکل ارائه آنها در داروخانه ها نیز در نرم افزار گنجانده شده است. 6. داروهای گیاهی: این قسمت دارای اطلاعات بیش از 80 داروی گیاهی رسمی به همراه نام و مشخصات تولید کننده آن در کشور ایران است. 7. بیماریها: شامل توضیحات کلی در مورد شناسایی علایم و همچنین روش های پیشگیری از تعداد حدود 500 بیماری شناخته شده. 8. درمانها: شامل انواع نسخه های گیاهی در مورد درمان 44 رده از بیماریها و مشکلات شایعی که اکثر مردم به آنها دچار میشوند مانند انواع نسخه های تقویت قوای جسمی، گیاهان و خوراکیهای ضد سرطان، تقویت بینایی و غیره 9. طب سنتی: این قسمت شامل بیش از 130 نسخه سنتی ایرانی است که بر اساس علم مزاج شناسی و در کتب کهن طب ایرانی گرد آوری شده اند و به ارائه روشهای تقویت و مبارزه با بیماریهای ممکن د رمورد تمامی اعضای بدن انسان میپردازد. 10. طب اسلامی: این قسمت یکی از کاملترین مجموعه های احادیث ائمه است که در مورد طب، سلامت روان و سلامت جسم ارائه شده اند. مجموعه 188 حدیث از رسول اکرم (ص)، امام باقر (ع)، امام صادق (ع)، امام رضا (ع) و ... که در مورد موضوعات مختلفی از جمله تغذیه اسلامی، بهداشت فردی، بهداشت روانی، خواص روزه، خواص خوراکیها و غیره ارائه شده است. بخش اطلاعات پزشکی دارای مجموعه های مقالات طبی، پوست و مو، انواع رژیم ها، روش تهیه داروها و راهنمای جواب آزمایش می باشد. 11. مقالات عمومی: این قسمت شامل حدود 600 مقاله اطلاعات عمومی در مورد سلامت و بهداشت میباشد. 12. پوست و مو: شامل مجموعه ای در حدود 200 مقاله جذاب و خواندنی در رابطه با انواع روشهای محافظت از پوست و مو، انواع ماسکهای صورت، تقویت ریشه موها، روشهای زیبایی مو و پوست برای بانوان و غیره. 13. رژیمها: یک مجموعه استثنایی از 48 مقاله در مورد انواع رژیمهای غذایی که شامل رژیم غذایی هنرپیشه ها و افراد معروف و همچنین انواع رژیمهای لاغری، چاقی، مناسب کودکان، مناسب بارداری و غیره میباشد. همچنین اطلاعات بسیار مفیدی در مورد رژیم و پرهیزهای غذایی مورد نیاز برای بیماران دیابتی، فقرآهن و انواع بیماریهای رایج مردانه و زنانه ارائه شده است. 14. روش تهیه: انواع راهنما و دستورالعمل تهیه و مصرف داروهای گیاهی، پماد، پودر، شستشو، جوشانده و غیره. 15. برگ آزمایش: مجموعه اطلاعات بسیار مفید و کاربردی در مورد روش خواندن انواع برگه های جواب آزمایش طبی مانند آزمایش خون، آزمایش بارداری، آزمایش ادرار و غیره که تمامی مشخصه های موجود در آزمایشها را به طور کامل تشریح نموده است. جهت دریافت رایگان این برنامه اینجا کلیک کنید. https://cafebazaar.ir/app/it.tadbir.tabib
  27. 1 like
    به نام خدا به زودی در همین تاپیک با آموزش ها و مثال های کاتلین با شما خواهیم بود. لطفا به این تاپیک پاسخ ندهید
  28. 1 like
    روی اعلامیه ها کار کنید با این که یه اعلامیه رو چک میکنی و میبینیش باز هم هر چند ثانیه یک بار روی صفحه ظاهر میشه
  29. 1 like
    میشه فایلbuilde.gradle رو هم ببینم؟ احتمالا باید کتابخانه های اضافه رو از داخل گریدل پاک کنید... مثلا میتونید اینها رو پاک کنید: compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) testCompile 'junit:junit:4.12' testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
  30. 1 like
    در این پست میخوایم خیلی سریع و کوتاه نحوه کار با Google maps رو بررسی کنیم. من فرض می کنم که شما در مورد برنامه نویسی در اندروید اطلاعات لازم رو دارید، تا بتونیم توضیحات رو کوتاه کنیم و به بخش اصلی کار بپردازیم. با فرض اینکه از طریق این لینک تونستید مقدمات وارد کردن گوگل مپ رو پیاده سازی کنید به سراغ توضیحات مورد نظر میریم. من از Fragment برای پیاده سازی UI استفاده کردم، به این صورت که در این اپ که کار توسعه اون رو انجام میدادیم از چند تب برای دسترسی به بخشهای مختلف استفاده کردیم، و تب Map رو با Fragment ساختیم و کد xml رو به این نحو نوشتیم: <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:background="@color/bg" tools:context="com.app.androidstudio.example.MapFragment"> <com.google.android.gms.maps.MapView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/mapView"> </com.google.android.gms.maps.MapView> </RelativeLayout> حالا به سراغ کد نویسی کلاس جاوا میریم، یه کلای جاوا به اسم MapFragment داریم، که به صورت زیر کد نویسی شده: (از توضیحات نحوه نوشتن کدهای مربوط به Fragment چشم پوشی کردم، در صورت نیاز و برخورد با سوال در همینجا مطرح کنید) import android.content.pm.PackageManager; import android.database.Cursor; import android.location.Criteria; import android.location.Location; import android.location.LocationManager; import android.os.Bundle; import android.support.v4.app.ActivityCompat; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.ListView; import android.widget.SimpleCursorAdapter; import android.widget.TextView; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.MapView; import com.google.android.gms.maps.MapsInitializer; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.model.CameraPosition; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; /** * Created by s.jahanzadeh on 05/30/2017. */ public class MapFragmentMain extends Fragment { //معرفی آبجکتها و متغیرها به صورت گلوبال private MapView mapView; private GoogleMap googleMap; private TextView latitudeText, longitudeText; private static final String[] LOCATION_PERMS = { android.Manifest.permission.ACCESS_FINE_LOCATION }; private static final String[] COARSE_PERMS = { android.Manifest.permission.ACCESS_COARSE_LOCATION }; public MapFragmentMain() { // این بخش رو خالی بذارید } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //در اینجا نیازی به کد نویسی در این بخش نیست } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //معرفی یک ویو برای فرگمنت View view = inflater.inflate(R.layout.map, container, false); //find view by ids latitudeText = (TextView) view.findViewById(R.id.latitudeText); longitudeText = (TextView) view.findViewById(R.id.longitudeText); mapView = (MapView) view.findViewById(R.id.mapView); mapView.onCreate(savedInstanceState); //با این دستور در واقع داریم زمینه رو برای استفاده از گوگل مپ فراهم میکنیم //بعضی از APIها نیاز به فراهم کردن بستر قبل از استفاده از اونها دارن //مانند BitmapDescriptorFactory و CameraUpdateFactory try { MapsInitializer.initialize(getActivity().getApplicationContext()); } catch (Exception e) { e.printStackTrace(); } // استفاده از getMapAsync باعث میشه که به صورت خودکار مپ به نمایش بیاد //البته نکات خیلی زیادی این مطلب داره که اگر بخوام به یکی از اونها اشاره بکنم این هست که //به دلیل استفاده از فرگمنت هر زمانی که ما view رو تغییر بدیم طبیعتا چرخه حیاطش فرگمنت به پایان میرسه //منظور از تغییر view رفتن به یک فرگمنت دیگه هست //تمامی آبجکتهایی که با گوگل مپ در ارتباط هستند به نوعی با ویو ما در ارتباط خواهند بود //پس این نکته خیلی مهمی هست که آبکتهایی مثل مارکر رو در پس زمینه نگه نداریم //چرا که باعث درگیر کردن مموری خواهد شد در به احتمال بسیار زیاد اگر دوباره این فرگمنت رو فراخوانی کنید ویو قفل خواهد کرد //دقیقا مشابه AsyncTask mapView.getMapAsync(new OnMapReadyCallback() { @Override public void onMapReady(GoogleMap mMap) { googleMap = mMap; googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); // برای رفتن به موقعیت کاربر روی نقشه googleMap.getUiSettings().setMyLocationButtonEnabled(true); //بررسی permissionهای مورد نیاز if (ActivityCompat.checkSelfPermission(getContext().getApplicationContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getContext().getApplicationContext(), android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. requestPermissions(LOCATION_PERMS, 1337 + 3); requestPermissions(COARSE_PERMS, 1337 + 3); return; } //فعال کردن دکمه location روی نقشه googleMap.setMyLocationEnabled(true); //کدهای این قسمت خیلی مهم هستند //استفاده از locationManager برای دسترسی به سرویس لوکیشن LocationManager locationManager = (LocationManager) getActivity().getSystemService(getContext().getApplicationContext().LOCATION_SERVICE); //در کلاس Criteria متدی وجود داره با عنوان getBestProvider //استفاده از این کلاس باعث میشه که از بین GPS و Network هر کردوم که بهتر و قویتر بود مورد استفاده قرار بگیره Criteria criteria = new Criteria(); //گرفتن لوکیشن با استفاده از اطلاعات بالا Location location = locationManager.getLastKnownLocation(locationManager.getBestProvider(criteria, false)); //بردن دوربین نقشه روی محل کاربر CameraPosition cameraPosition = new CameraPosition.Builder().target(new LatLng(location.getLatitude(), location.getLongitude())).zoom(15).build(); //متحرک سازی دوربین googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); //ساخت مارکر با استفاده از نگه داشتن انگشت روی نقشه googleMap.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener() { @Override public void onMapLongClick(LatLng latLng) { Marker marker; marker = googleMap.addMarker(new MarkerOptions().position(latLng).title("Point").snippet("My point")); double currentLat = marker.getPosition().latitude; double currentLon = marker.getPosition().longitude; latitudeText.setText(Double.toString(currentLat)); longitudeText.setText(Double.toString(currentLon)); } }); } }); return view; } //همونطور که در بالا توضیح دادم جهت جلوگیری از پر شدن نا بجای مموری طبق روال همیشگی متدهای زیر رو بسازید @Override public void onResume() { mapView.onResume(); super.onResume(); } @Override public void onPause() { super.onPause(); mapView.onPause(); } @Override public void onDestroy() { super.onDestroy(); mapView.onDestroy(); } @Override public void onLowMemory() { super.onLowMemory(); mapView.onLowMemory(); } } این بدنه اصلی کدهای ما بود. امیدوارم توضیحات کافی باشه، در صورت نیاز سوالهاتون رو مطرح کنید تا هم دوستان بتونن جواب بدن هم بنده اگر در توانم باشه. مطمئنا کدهای بالا خالی از اشکال نیستن، پس اگر مطلبی جا افتاده به بزرگی خودتون بنده حقیر رو ببخشید... - با تشکر
  31. 1 like
    RecyclerViewFastScroller یک ویجت است که می توان از آن برای پیمایش سریع استفاده کرد. RecyclerViewFastScroller-master.zip
  32. 1 like
    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);
  33. 1 like
    سلام دوست عزیز باید از spans استفاده کنید به این صورت final SpannableStringBuilder sb = new SpannableStringBuilder("your text here"); // Span to set text color to some RGB value final ForegroundColorSpan fcs = new ForegroundColorSpan(Color.rgb(158, 158, 158)); // Span to make text bold final StyleSpan bss = new StyleSpan(android.graphics.Typeface.BOLD); // Set the text color for first 4 characters sb.setSpan(fcs, 0, 4, Spannable.SPAN_INCLUSIVE_INCLUSIVE); // make them also bold sb.setSpan(bss, 0, 4, Spannable.SPAN_INCLUSIVE_INCLUSIVE); yourTextView.setText(sb); این هم یک آموزش دیگه https://blog.stylingandroid.com/introduction-to-spans/
  34. 1 like
    سلام <?php echo $_POST['Test']; echo $_GET['Test']; زمانی که از متد POST برای ارسال استفاده میکنید از $_POST استفاده کنید زمانی که از GET هم تابع $_GET ببینید مقدار test اسم اون فیلدی هستش که دارید از سمت اندروید میفرستید فیلد ی که از سمت اندروید دارید میفرستید به صورت زیر هستش .addBodyParameter("Test", "مقدار ارسالی")
  35. 1 like

    نگارش 1.0.0

    6 دانلود

    با استفاده از FilePicker شما میتونید در اپلیکیشن خود فایل مورد نظرتان را آپلود یا Attach کنید.

    رایگان

  36. 1 like
    آموزش کتابخانه Picasso در صورتی که در اپلیکیشن خود نیاز دارید تا تصاویری که از سمت سرور URL برای شما ارسال میشود را کش و نمایش دهید میتوانید از کتابخانه Picasso استفاده نمایید. 1-امکانات Picasso : کشینگ اتوماتیک و سریع Transform کردن سریع با حداقل Memory اتصال به ImageView برای نمایش تصاویر 2-طریقه استفاده : ابتدا کتابخانه مورد نظر را به طریقه دو روش بخش شوم Import نمایید Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView); آشنایی با پارامتر ها with در این بخش باید context را به این متد بفرستم load آدرس تصویر به صورت http into میبایستی اسم ویجت ImageView که قرار است تصویر را بارگذاری نماید را قرار دهیم 3-طریقه Import کردن کتابخانه : 1- Gradle : compile 'com.squareup.picasso:picasso:2.5.2' 2- فایل Jar : دریافت Jar فایل Picasso picasso-2.5.2(1).jar 4- Picasso از نمایش تصاویر متحرک(Gif) پشتیبانی نمیکند وب سایت پشتیبانی Picasso http://square.github.io/picasso/
  37. 1 like
    سلام دوستان عزیز معرفی کانال ناجی دولوپرز: این کانال با هدف آموزشی سرگرمی برای توسعه دهندگان افتتاح شد و هم اکنون با بیش از 1300 عضو همچنین به فعالیت خود ادامه میدهد از شما دعوت میکنیم که به این کانال بپیوندید: https://telegram.me/NajiDevelopers شما میتوانید همچنین سایت این کجموعه را نیز دنبال کنید: NajiDevelopers.iR معرفی کانال کتابخانه های اندروید: کانال کتابخانه اندروید افتتاح شد
  38. 1 like
    سلام دوستان امروز میخوام یکی از ساده ترین و کاربردی ترین کتابخانه هایی که برای اندروید نوشته شده رو بهتون معرفی کنم: ButterKnife [align=right]همونطور که میدونید در هر برنامه اندرویدی شما برای اینکه بتونید به عناصر layout هاتون در کد جاوا دسترسی داشته باشید مجبورید تا از متد findViewById استفاده کنید که در این صورت اگر ویجت هاتون زیاد باشن اونوقت باید این متد رو دائما فراخوانی کنید. کاری که این کتابخونه میکنه اینه که شما رو از این کار بی نیاز میکنه! یعنی بهتر بگم: این کتابخونه ایه که شما باید در تمام پروژه هاتون ازش استفاده کنید![/align] [align=right]ابتدا در فایل Build.Gradle خط زیر رو به قسمت dependencies اضافه کنید و Gradle رو sync کنید:[/align] compile 'com.jakewharton:butterknife:7.0.1' من در پروژم یک فایل layout دارم که درون این فایل فقط یک دکمه قرار داره id این دکمه btn هست: android:id="@+id/btn" android:text="GO!" android:layout_width="wrap_content" android:layout_height="wrap_content" /> حالا وقتی میخوام در فایل اکتیویتی به این دکمه دسترسی داشته باشم و براش رویداد تعریف کنم به جای طی کردن روال عادی، به صورت زیر عمل می کنم: public class MainActivity extends AppCompatActivity { @Bind(R.id.btn) Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "Clicked!", Toast.LENGTH_SHORT).show(); } }); } } به خط اول در کلاس MainActivity دقت کنید: ما با همین کار ساده در یک لحظه هم دکمه رو تعریف کردیم و هم کار findViewById رو انجام دادیم! فقط در یک خط! قدرت این کتابخونه در اینجا مشخص میشه. (Bind یک Annotation هست نه متد) همچنین در متد onCreate بعد از setContentView باید خط زیر رو بنویسیم (در کد بالا هم میبینید): ButterKnife.bind(this); شاید با یک ویجت خیلی فایده این کتابخونه معلوم نشه اما همین کد رو فرض کنید وقتی که ۱۰ تا ویجت در layout مون داشته باشیم! میبینید که چقدر حجم کد کم میشه! نکته: در این کتابخونه برای تعریف رویداد هم روشی وجود داره که به نظرم خیلی جالب نیست برای همین اینجا نیاوردم. اطلاعات بیشتر: https://github.com/JakeWharton/butterknife موفق باشید