برنامه نویسی موبایل اندروید

تغییر رنگ وکتور در اندروید استودیو

استفاده از وکتور در ساخت اپلیکیشن اندروید به کاهش حجم فایل نصبی شما کمک می کند. شما با استفاده از Vector assets  در اندروید می توانید فایل های svg  خود را تبدیل به xml کرده واز آنها استفاده کنید.

همچنین می توانید رنگ آنها را در قسمت fill تغییر دهید اما یادتان باشد که :


از دادن ادرس از فایل color به آن خود داری کنید و فقط به این صورت رنگ را به آن اعمال کنید برای اینکه فقط در api 21 به بالا کار خواهد کرد.


 fillColor="#colorvalue"       , don't use a @ color reference because they only work SDK 21+ for vectors

 نمونه فایل تبدیل فایل وکتور به xml


<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportWidth="24.0"
        android:viewportHeight="24.0">
    <path
        android:fillColor="#FFFFFF"
        android:pathData="M3,18h18v-2H3v2zm0,-5h18v-2H3v2zm0,-7v2h18V6H3z"/>
</vector>
۰ نظر موافقین ۰ مخالفین ۰
ُسینا رحیمی

رنگ های متریال دیزاین (Material Design Color)

دانلود رنگ های متریال دیزاین در قالب یک فایل xml


۰ نظر موافقین ۰ مخالفین ۰
ُسینا رحیمی

Ripple Effect (ریپل افکت) در اندروید


تا به امروز برای اعمال Ripple Effect  بیشتر از کتابخانه هایی که اماده درست کرده بودند استفاده کردم و این موضوع که کتابخانه ها حجم برنامه رو زیاد می کنن من رو به این فکر انداخت که بتونم بدون استفاده از 

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

راه حل رو به رو بدون اضافه کردن کتابخانه ی خاصی به این موضوع پرداخته است :


Basic ripple setup

  • Ripples contained within the view.
    android:background="?attr/selectableItemBackground"
  • Ripples that extend beyond the view's bounds:
    android:background="?attr/selectableItemBackgroundBorderless"

    Have a look here for resolving ?attr xml references in Java code.

(This is how you do it:
// Create an array of the attributes we want to resolve
// using values from a theme
int[] attrs = new int[] { R.attr.listItemBackground /* index 0 */};

// Obtain the styled attributes. 'themedContext' is a context with a
// theme, typically the current Activity (i.e. 'this')
TypedArray ta = themedContext.obtainStyledAttributes(attrs);

// To get the value of the 'listItemBackground' attribute that was
// set in the theme used in 'themedContext'. The parameter is the index
// of the attribute in the 'attrs' array. The returned Drawable
// is what you are after
Drawable drawableFromTheme = ta.getDrawable(0 /* index */);

// Finally, free the resources used by TypedArray 
ta.recycle();

----------------------------------------------------------

Support Library

  • Using ?attr: instead of ?android:attr references the support library, so is available back to API 7.

Ripples with images/backgrounds

  • To have a image or background and overlaying ripple the easiest solution is to wrap the View in a FrameLayout with the ripple set with setForeground() or setBackground().

Honestly there is no clean way of doing this otherwise, though Nick Butcher did post this on the subject of ImageViews with ripples.


لیست کتابخانه هایی که ریپل افکت دارند :


۰ نظر موافقین ۰ مخالفین ۰
ُسینا رحیمی

تبدیل فایل اکسل به sqlite

با سلام امروز به یک سایت انلاین برخوردم که فایل اکسل رو بهش میدید و برای شما یک فایل sqlite بر میده ؛ خوبیش اینه که با زبان فارسی سازگاره و خیلی از نکاتی که شما توی جدول داخل اکسل گذاشتین رو براتون خیلی راحت تبدیل می کنه.

Convert CSV or Excel File To SQLite

http://converttosqlite.com/convert

۱ نظر موافقین ۰ مخالفین ۰
ُسینا رحیمی

اپ شما چرا باید کرش کند؟

بسیار دیده ام که برنامه نویسان به هر قیمتی سعی در جلوگیری از کرش ها  می کنند. اما اکسپشن هایی را که نمی شود کنترل کرد واقعا آزار دهنده هستند؟ و در این مورد چک کردن null ها جواب ما است ؟ 

در حقیقت، در بعضی مواقع عمدا میخواهید که اپ شما کرش کند. این پست به شما توضیح خواهد داد که چرا ، و به شما نیز چند نکته ی کاربردی پیشنهاد می دهد.

پیش در آمد

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


ساختار چک کردن فیلد های خالی 

(THE NULL CHECK ARCHITECTURE)


در حال حاضر ما یک اپلیکیشن ساده داریم که فقط لیستی از بازیکنان فوتبال را نشان می دهد:

public void showPlayers(List<Player> soccerPlayers) {
 if (soccerPlayers == null) return;
 // some awesome code here
}

همه چی حل شد!

نه صبر کنید… لیست می تواند خالی هم باشد:

public void showPlayers(List<Player> soccerPlayers) {
 if (soccerPlayers == null || soccerPlayers.isEmpty()) return;

 // some awesome code here
}

حال در مورد آن پنج لایه ای آرتیتکت بازیکنان فوتبال که در زیر ui قرار دارند چی ؟ آیا باید در هر لایه از آنها چک کردن خود را قرار بدهیم؟

قبل از آنکه بدانید باید چک کردن فیلد خالی را در همه جا اعمال کنید!


مشکل چک کردن فیلد خالی

واضح است که، چک کردن فیلد های خالی کد های شما را به طور قابل ملاحظه ای در هم و برهم می کند.

اما این تنها مشکل نیست! برای اینکه هنگامی که آن را در جایی استفاده کنید، در همه جا از آن استفاده خواهید کرد.

public void showPlayers(List<Player> soccerPlayers) {
 if (soccerPlayers == null) return;

 if (myRecyclerView == null) return;

 if (myRecyclerView.getAdapter() == null) return;

 // some awesome code here
}

حتی وقتی که به آنها احتیاج نداشته باشید، شما هنوز هم آن را اضافه می کنید… اجازه دهید لحظه ای عمیق تر شوید. مشکل دقیقا کجاست؟

ایا soccerPlayers می توانند از اول خالی باشند؟ چه اتفاقی رخ می دهد وقتی که soccerPlayers کلا خالی باشد؟مطمئنا به کاربر یک صفحه ی کاملا خالی نشان می دهد.

کرش کردن برای نجات

اگر اپلیکیشن شما به مرحله ای برود که برای آن طراحی نشده است، باید کرش کند. هیچ راه عمومی برای رسیدگی به آن نیست.متدها نباید ورودی های خود را چک کنند برای هر سناریو که ممکن است اتفاق بیافتد. به جای آن، شما باید دقت کنید که آن ورودی چیست و برای آن آماده باشید.


اکسپشن های غیرمنتظر خوب هستند برای اینکه :

  • با کرش کردن اپلیکیشن بلافاصله به شما اطلاع میدهند.
  • مشکلات را هایلایت میکند به جای آنکه به صورت پنهان باشند.
  • مشکل را دنبال کنید تا به آن برسید.
  • به کرش ریپورت شما فرستاده می شود .
نکات کاربردی

برای آنکه این قسمت برای شما قابل هضم تر شود و به شما در اجرای این کارها کمک شود :
همیشه اپلیکیشن خود را طوری دیزاین کنید که ورودی های غیر قابل کنترل جلوگیری شود: 

اگر شما اطمینان ندارید که ارور خاصی می تواند جایی اتفاق بیافتد، در نظر بگیرید که اتفاق نمی افتد! در طول تست کردن متوجه می شوید (RuntimeException) 

با اطمینان از درستی دیتا در همان ورود اول در اپ شما. این راه دیتا های بی اعتبار(null, empty,..)

اگر یک متد خاص نمی تواند در عمل صدا زده شود، و یک بار می تواند فقط صدا زده شود،… throw an IllegalStateException

همیشه کاملا تست کنید قبل از آنکه به طرف کاربران خود بفرستید.

جمع بندی

به جای آنکه از کرش کردن بترسید، باید آنها را به سرعت پیدا کرده. کرش ها نه تنها ارور ها را ظاهر می کنند، بلکه یک راه راحت برای دیباگ کردن آنها با stacktrace می باشد.


منبع : http://jeroenmols.com

۰ نظر موافقین ۰ مخالفین ۰
ُسینا رحیمی

تب لی اوت (TabLayout)

عکس : سایت http://www.androidhive.info  

علت نوشتن این پست این بود که من از تب لی اوت همراه با ویوپیجر برای پروژه ایی که داشتم روش کار می کردم استفاده کرده بودم اما یک جای کار ایراد داشت اونم این بود که من چهار تا تب داشتم و هرکدام از اونها از وب سرویس اطلاعات رو می گرفت . بعضی عملیات در داخل این تب ها به هم وصل بود. همراه با انجام اون عملیات باید تب کناری هم رفرش میشد.

یک ویژگی viewpager این است که setoffscreenpagelimit  برای اون حداقل می تونه یک باشه. 

Setoffscreenpagelimit = امکان این که چند تب از هر دو طرف تب در حال اجرای شما، همزمان با هم لود شوند.

من میخواستم که وقتی بین تب ها هر وقت سویچ می کنم فرگمنت داخل اونها کامل Destroy‌ بشه و دوباره از اول ساخته بشه اما این عمل انجام نمی شد یعنی اگر شما بلافاصله به تب های کناریتون سویچ کنید،‌اونها از قبل لود شدن. هرکاری کردم این کار درست نشده که بتونم کاری کنم که تب های کناری بدون اینکه Select بشن لود نشن از قبل. بعد از کلی تحقیق متوجه شدم که  راهی جز حذف ویوپیجر ندارم.

این Tablayout whithout Viewpager   لینکی است که ازش استفاده کردم برای این کار 


بعد از استفاده از این روش متوجه مشکل دیگه ای شدم این بود که هنگامی که داخل فرگمنتها که Tablayout‌ بود. 

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

راه حلش رو پیدا کردم و براتون قرار دادم امیدوارم بتونه به صرفه جویی در زمان شما کمک کنه.


چند نکته هست که باید رعایت کنید 
۱- در کد رو به رو باید اخرین فرگمنت دست چپ رو قرار بدهید. (منظور شماره اون هست)
tabs_fragment.getTabAt(1).select();

۲- کدهایی رو که مربوط به Ui نیست رو در متد onActivityCreat‌ قراردهید. 

۳-  یکی از نکته هایی که من متوجه شدم این بود که در این روش اولویت ها مهم هستن یعنی از بالا اخرین فرگمنت سمت چپ می باشد.(دلیل آن هم انگلیسی بودن این موضوع است که  سازندگان از چپ اول را در نظر می گیرند و ما میخوایم برای فارسی از راست در نظر بگیریم) . 
true  را هم به اخرین تب سمت چپی می دهیم. در حالت نرمال باید به اولین تب سمت راست true‌ را در نظر بگیریم که هنگام اجرا روی اولین تب سمت راست سلکت شده باشد اما در اینجا برعکس است.

private void setupTabLayout() {
   
fragment2 = new RequestFrienshipFragment();
   
fragment1 = new FriendshipFragment();
   
tabs_fragment.addTab(tabs_fragment.newTab().setText("two"), true);
   
tabs_fragment.addTab(tabs_fragment.newTab().setText("one"));
}


۴- اولویتی که رو هم که در بالا اجرا کردیم باید همین را در این قسمت اجرا کنیم.

private void setCurrenttabFragment(int tabPosition) {
   
switch (tabPosition) {
       
case 0:
            replaceFragment(
fragment2);
           
break;
       
case 1:
            replaceFragment(
fragment1);
           
break;
    }
}

اگر سوالی در مورد Tablayout‌ داشتید در قسمت نظرات بپرسید در کمترین زمان پاسخ گوی شما هستم. 


کد کامل :

public class FriendsFragment2 extends Fragment {
    CustomTabLayout
tabs_fragment;
    FriendshipFragment
fragment1;
    RequestFrienshipFragment
fragment2;
   
public FriendsFragment2() {
       
// Required empty public constructor
   
}

   
@Nullable
    @Override
   
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container
            ,
@Nullable Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.
fragment_friends2, container, false);
       
tabs_fragment = (CustomTabLayout) rootView.findViewById(R.id.tabs_fragment);
       
return rootView;
    }
   
@Override
   
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
       
super.onActivityCreated(savedInstanceState);

       setupTabLayout();
       EventTab();
       
tabs_fragment.post(new Runnable() {
           
@Override
           
public void run() {
               
tabs_fragment.getTabAt(1).select();
            }
        });
   }

   
private void setupTabLayout() {
       
fragment2 = new RequestFrienshipFragment();
       
fragment1 = new FriendshipFragment();
       
tabs_fragment.addTab(tabs_fragment.newTab().setText("درخواست دوستی"), true);
       
tabs_fragment.addTab(tabs_fragment.newTab().setText("دوستان"));
    }
   
private void EventTab() {
       
tabs_fragment.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
           
@Override
           
public void onTabSelected(TabLayout.Tab tab) {
                setCurrenttabFragment(tab.getPosition());
            }

           
@Override
           
public void onTabUnselected(TabLayout.Tab tab) {
            }
           
@Override
           
public void onTabReselected(TabLayout.Tab tab) {
            }
        });
    }
   
private void setCurrenttabFragment(int tabPosition) {
       
switch (tabPosition) {
           
case 0:
                replaceFragment(
fragment2);
               
break;
           
case 1:
                replaceFragment(
fragment1);
               
break;
        }
    }
   
private void replaceFragment(Fragment fragment) {
        FragmentManager fm = getChildFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
;         ft.replace(R.id.frame_container_friends_fragment, fragment);
        ft.setTransition(FragmentTransaction.
TRANSIT_FRAGMENT_OPEN);
        ft.commit()

۱ نظر موافقین ۰ مخالفین ۰
ُسینا رحیمی

Bottom Sheets در اندروید

bottom-sheet

باتم شیت (Bottom sheet) یکی از امکانات متریال دیزاین می باشد، که به کتابخانه ی دیزاین ساپورت در ورژن 23.2 اضافه شده بود.  باتم شیت یک  پنجره بسیار ساده است که از پایین صفحه ظاهر می شود، و میتواند اطلاعات بیشتری به کاربر نشان دهد. نمونه ی باتم شیت را می توان در بعضی اپلیکیشن های گوگل و ویجت ها مشاهده کرد، مانند انتخاب مکان از Api ‌مکانی.
در این پست ، ما میخواهیم نحوه ی استفاده از باتم شیت در اپلیکیشن را به شما نشان دهیم. باتم شیت میتواند قسمتی از رابطه کاربری یا یک مدل موقت باشد. برای رسیدن به این امکانات،‌ امکاناتی را که کتابخانه ساپورت دیزاین برای شما فراهم می کند شامل :


BottomSheetBehavior  : میتواند در CoordinatorLayout استفاده شود.
BottomSheetDialog : که یک دیالوگ همراه با رفتار باتم شیت می باشد.
BottomSheetDialogFragment :  که بسطی از DialogFragment، که یک aBottomSheetDialog  ساخته به جای یک دیالوگ استاندارد.

برای شروع و استفاده باتم شیت در اپلیکیشن شما، کتابخانه ساپورت را به  dependecy  خود در فایل build.gradle  اضافه کنید.





compile 'com.android.support:design:'


ساخت یک باتم شیت ثابت : یک لی اوت با بهCoordinatorLayout به عنوان لایه ی اصلی بسازید،‌ س‍پس یک view یا layout برای باتم شیت،‌ بصورت آنکه فرزند مستقیم CoordinatorLayout درست کنید. لی اوت باتم شیت باید صفت app:layout_behavior را در خود داشته باشد،‌ با مقدار android.support.design.widget.BottomSheetBehavior. به عنوان مثال:


<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context="com.mayojava.sample.bottomsheetdemo.MainActivity">

   <!-- main content layout-->
   <RelativeLayout
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:paddingBottom="@dimen/activity_vertical_margin"
       android:paddingLeft="@dimen/activity_horizontal_margin"
       android:paddingRight="@dimen/activity_horizontal_margin"
       android:paddingTop="@dimen/activity_vertical_margin">
       ......
   </RelativeLayout>

   <!-- bottom sheet layout -->
   <RelativeLayout
       android:id="@+id/linear_layout_bottom_sheet"
       android:layout_width="match_parent"
       android:layout_height="220dp"
       app:behavior_peekHeight="80dp"
       app:behavior_hideable="true"
       app:layout_behavior="@string/string_bottom_sheet_behavior"
       android:elevation="@dimen/z_bottom_sheet"
       android:background="@color/color_bottom_sheet">
       <TextView
           android:id="@+id/text_view_sheet_title"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:text="@string/text_pull_to_show_more"
           android:textSize="@dimen/text_size_medium"
           android:padding="@dimen/activity_vertical_margin"/>

       <TextView
           android:id="@+id/text_view_more_content"
           android:text="@string/text_more_contet_to_user"
           android:textSize="@dimen/text_size_big"
           android:textStyle="bold"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:layout_below="@+id/text_view_sheet_title"
           android:paddingLeft="@dimen/activity_vertical_margin"
           android:paddingRight="@dimen/activity_vertical_margin"/>

       <Button
           android:text="@string/text_click_me"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:layout_alignParentLeft="true"
           android:layout_marginLeft="@dimen/activity_vertical_margin"
           android:layout_marginRight="@dimen/activity_vertical_margin"

           android:layout_marginTop="@dimen/activity_vertical_margin" android:layout_below="@+id/text_view_more_content"/>

   </RelativeLayout>

</android.support.design.widget.CoordinatorLayout>

برای آنکه باتم شیت قابل نشان دادن شود،‌با نیاز به ساخت BottomSheetBehavior داریم. که با فراخوانی BottomSheetBehavior.from() انجام می شود،‌ با فرستادن ویویی که درست کردیم برای این فرخوانی استفاده می کنیم. اینکار از طریق Activity‌ که در آن از باتم شیت استفاده کردیم انجام می شود.



LinearLayout bottomSheetLayout  
    = (LinearLayout) findViewById(R.id.layout_bottom_sheet);

//get bottom sheet behavior from bottom sheet view
BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from(mLayoutBottomSheet);

با بازگشت به آبجکت BottomSheetBehavior،‌می تواند متد setState‌را فراخوانی کرد،‌ با فرستادن رفتار ثابت،‌که موقعیت باتم شیت را تحت تاثیر قرار می دهد.
  •  BottomSheetBehavior.STATE_EXPANDED : باتم شیت را به طور کامل باز می کند. 
  • BottomSheetBehavior.STATE_HIDE باتم شیت را به طور کامل از دید خارج می کند. 
  • BottomSheetBehavior.STATE_COLLAPSED ارتفاع باتم شیت را به همراه با تنظیم آن در اتریبیوت peekHeight .
//to expand the bottom sheet
mbottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);

//to collapse the bottom sheet
mbottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);

peekHeight ‌می تواند به عنوان پیش نمایش هنگامی که صفحه ظاهر می شود استفاده شود. از طریق اتریبیوت behavior_peekHeight در فایل xml‌ یا در کد،‌  با  فراخوانی setPeekHeighton  در آبجکت BottomSheetBehavior  استفاده شود.

);mbottomSheetBehavior.setPeekHeight(320);

ساخت یک مدل باتم شیت 


مدل باتم شیت یک دیالوگ همراه با رفتار باتم شیت می باشد،‌ و همچنین قسمتی از هایراکی ویو شما نیست. می تواند به عنوان منوی جایگزین استفاده شود،‌ انتخاب کننده محتوا یا یه عنوان یک دیالوگ ساده در اپلیکیشن شما باشد. 

Create a class that extends BottomSheetDialogFragment, inflated with the layout that will be used as the content of the modal dialog.


یک کلاس بسازید که از BottomSheetDialogFragment   اکستند(extends ) شده باشد،‌ لی اوت را inflated کرده  که در اینجا به عنوان محتوای مدل دیالوگ ما استفاده می شود.


layout_custom_bottom_sheet.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_vertical_margin"
    android:paddingRight="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingTop="@dimen/activity_vertical_margin">

    <ImageView
        android:id="@+id/ic_image"
        android:src="@mipmap/ic_launcher"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="@dimen/margin_normal"
        android:layout_marginTop="@dimen/activity_vertical_margin"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello bottom sheet"
        android:textSize="@dimen/text_size_medium"
        android:layout_marginTop="@dimen/activity_vertical_margin"
        android:layout_toRightOf="@+id/ic_image"
        android:layout_alignTop="@+id/ic_image"/>

    <TextView
        android:layout_marginTop="@dimen/activity_vertical_margin"
        android:layout_below="@+id/ic_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/text_lorem_ipsum"
        android:lineSpacingExtra="@dimen/margin_small"
        android:layout_marginBottom="@dimen/margin_normal"/>


</RelativeLayout>
یک instance  از از باتم شیت ساخته و با متد show‌ آن را نمایش دهید، با پاس دادن FragmentManager  و رشته ی tag‌  به عنوان  پارامتر.


CustomBottomSheetDialog bottomSheetDialog = CustomBottomSheetDialog.getInstance();
bottomSheetDialog.show(getSupportFragmentManager(), "Custom Bottom Sheet");

result_bottom_sheet
. کد کامل را می توانید از لینک روبه رو دانلود کنید
منبع : mayojava.github.io


۰ نظر موافقین ۰ مخالفین ۰
ُسینا رحیمی

نکته ریز : فرق بین Json Object وJson Array

زمانی JsonObject ‌است که از {} استفاده شود.

زمانی JsonArray است که از [] استفاده شود .

کاربرد آن  در وب سرویس می باشد.

* نکته ریز شامل نکاتی به صورت یاد آوری و کوتاه می باشد *
۰ نظر موافقین ۰ مخالفین ۰
ُسینا رحیمی

۸ مسئله که شما در اپ خود به اشتباه انجام می دهید

8tips

دانستن تمام بخش های داشتن یک اپلیکیشن حرفه ایی می تواند بسیار سخت باشد. گزینه های زیادی باید در نظر گرفته شود هنگامی که به طرف روند کارطراحی  و تجربه ی کاربری می روید ، به راحتی تمام گزینه هایی که به طرف موفقیت می رود فراموش می شود. اگر شما خود را در حال چالش با خود برای اینکه چرا اپلیکیشن شما هنوزدرحال تغییر نیست، یا هنوز دنبال مسیری هستید که پیشرفت کنید، مطلب زیر را بخوانید تا بدانید کدام اشتباه را در اپلیکیشن خود مرتکب شده اید:


۱- شما یک راهنمای خوب ندارید ( یا حداقل مناسب کاربر نیست):

داشتن یک راهنمای  درست وحسابی برای ایجاد یک ارتباط قوی با کاربران در ابتدای کار بحرانی برای شما می باشد. وقتی که کاربر برنامه ی شما را  برای اولین بار استفاده می کند، باید یک راهنمای دستوری برای استفاده از آن به صورت تصویری وجود داشته باشد، مانند اسکرین شات های خلاق که ویژگی های کلیدی را نشان بدهد. اگر به صورت تاثیر گذار انجام شود، روند راهنما می تواند یک موقعیت عالی برای راضی کردن کاربران در استفاده از پوش نوتیفیکیشن و آغازی برای شخصی سازی رابطه کاربری برطبق فعالیت های آنها باشد. راهنما شانس شما را برای نشان دادن ارزشهایتان به کاربران ، وایجاد رابطه  بین آنان افزایش می دهد. بدون داشتن راهنما، شما ریسک این را برای آنکه آنها هیچوقت از اپ شما استفاده نکنند را کرده اید، داشتن تجربه ی بد آنها، راحت تر بگویم خارج شدن از اپ بدون بازگشت دوباره به آن.


 چگونه یک راهنمای درست داشته باشیم: دولینگو، اپلیکیشن آموزش زبان، در داشتن راهنما برای کاربران جدید با پرسیدن سوال " سطح زبان آنها  چگونه است"، کارش را خوب انجام داده است.

Duoling

۲- اپلیکیشن شما شامل استراتژی بین کانالی نمی باشد:

ما در دنیای رو به افزایش ارتباطات می باشیم، حرکت بین پلتفرم ها و دستگاه های مختلف بدون از دست دادن ذره ایی دیتا. این موضوع برای ما تبدیل به طبیعت دوم شده است، . اگر می خواهید کاربران همچنان متصل بمانند به همین دلیل ، اپ شما نیاز به آسان کردن این روند دارد.حال چگونه این کار را انجام می دهید؟ با ورود به استراتژی بین کانالی. هر حرکتی که در یک کانال انجام می شود باید در تمام کانال های شما  برای ساخت یک پارچه ی انتقالات و فعل و انفعالات شخصی سازی شده ظاهر شود. به عنوان مثال وقتی کاربر بین وب سایت شما و اپ شما در حرکت است، اطلاعات مصرف شده آنها و تاریخچه ی خرید آنها در تجربه ی کار آنها در موبایل قابل دسترسی باشد. به علاوه، هنگامی که کاربران بین دستگاه های مختلف در تعامل هستند (ایپد، ایکس باکس، اسمارت فون)، تجربه آنها نباید خیلی متفاوت باشد.


انجام دادن درست بین کانالی : آمازون کار خود را عالی انجام داده است، او با اجازه دادن چرخش بین وب سایت  و اپ آنها بدون دست خوردن داده ها این کار را کرده است . هر رفتاری که در یک کانال انجام می شود در همه ی آنها ظاهر می شود تا یک تجربه ی ثابت را به شما بدهد. 

Amazon


۳. اپ شما یک روند ثبت نام دشوار را داراست.

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


۴‌. اپلیکیشن شما به راحتی با اپ های دیگر ارتباط برقرار نمی کند:

راه دیگری برای بالابردن جذابیت اپ خود می توانید انجام دهید تعامل با دیگر اپ ها می باشد. در حالی که شما نیازی ندارید که اپ خود را به هرچیزی وصل کنید، اپ های زیادی وجود دارد که می توانند برند موبایل شما را به زیبایی کامل کنند. مانند چگونگی اسنپ چت که با لیست شماره های موبایل شما ارتباط بر قرار می کند، یا Classpass که با اتصال به تقویم گوگل کلاسهایی که را که شما ثبت نام کرده را اضافه می کند، بهترین های این دسته سعی می کنند با هرچه بیشتر کردن پلتفرم های قابل اجرا برای ارائه ی و ورود به زندگی روزانه‌ی شما.


نمونه اپلیکیشنی که اینکار را به درستی انجام داده است: قابلیت اسنپ چت که وارد لیست تلفن اسمارت فون شما شده، برای اینکه به راحتی بتوانید آنها را به عنوان دوستان خود در پلتفرم های اجتماعی اضافه کنید.


snapchat

۵. آپ شما تجربه ی شخصی سازی را به کاربر نمی دهد:

اپ هایی که برای کاربران خود نیاز آنها را فراهم کرده و تنظیماتشان را برای بازگشت دوباره نگاه می دارند، این روند را درست انجام داده اند. در حالی که نکات سه و چهار فعالیت های مهم کاربران را لمس می کند، شخصی سازی کامل برای ساخت کامل تجربه ی شخصی سازی برای هر کاربرحتی  فراتر نیز می رود . مانند قابلیت اوبر که موقعیت شما را هنگامی که اپ را راه می اندازید می داند، اپلیکیشن شما باید اطلاعات کلیدی در مورد هر کاربر را بگیرد و آن را به نسبت تجربه آنها استفاده کند. بنابراین، مطمئن شوید که رفتار های داخل اپ را زیر نظر دارید، و به کاربران خوراک مناسب می دهید.


اپ که شخصی سازی را به درستی انجام داده است: گوگل مپ اطلاعات شما را در مورد مکانهایی که در ارتباط بودید در می آورد. در مثال زیر، آنها قابلیت این را دارند که اگر مکانی که من میخواهم به آنجا برسم در زمان رسیدن بسته خواهد بود، و این اجازه را به می دهد که برنامه ام را عوض کنم.

googlemap


۶. اپلیکیشن شما کپی سایت شماست:

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


۷. اپ شما عملکرد ضعیفی دارد:

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


۸. هیچ استراتژی برای اپ خود ندارید:

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


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

منبع : localytics.com



۰ نظر موافقین ۰ مخالفین ۰
ُسینا رحیمی

11 نکته قبل از آنکه شروع به ساخت اپلیکیشن بکنید باید بدانید



حدود 4.43 میلیارد یوزر موبایل در سراسر دنیا در سال 2015 وجود دارند و این رقم شروع به زیاد شدن به 5.07 میلیارد در سال 2019 خواهد رسید.

. در حال حاظر 1.6 میلیون اپلیکیشن اندروید در پلی استوروجود دارد.

. حدود 1.5 میلیون اپلیکیشن ای او اس در اپ استور وجود دارند.


در اینجا نکاتی وجود دارد که برنامه نویس قبل از آنکه بخواهد کار ساخت اپلیکشن خود را شروع کند باید در نظر بگیرد:

1- جست و جوی بسیار در مارکتهای موجود

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

بنابراین شما باید  قسمت های اذیت کننده را نکته برداری بکنید و سعی کنید که آنها را حل کنید. این استراتژی به شما شانس برنده شدن در مقابل رقبا را می دهد.


نمونه هایی از مارکت های معروف موجود:


android markets


2. بهره بری

من همیشه از این کاربرد ساده ی مانترا استفاده می کنم، " اگر کاری را انجام می دهید، آن را با 100 درصد بهره وری و درستی انجام دهید، اگرنه آن را انجام ندهید.". این چیزی است که کاربران از هر اپلیکیشنی که در حال حاضر وجود دارد طلب می کنند. وقتی می گویم کار آمد منظور ، تبادل بهینه در دیتا نیز می باشد. اپلیکیشنهای اسمارت فون ها که  اکثرا از دیتا 3G و4G استفاده می کنند دانلود می شوند و بعد فراموش می شوند، اگر شما می خواهید اپلیکیشن شما در این دسته بندی قرار نگیرد، مطمئن شوید که اپلیکیشن شما به صورت بهینه از دیتا استفاده می کند.



3.متفاوت باشید

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

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



4. کاربران را منتظر نگذارید

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




5- مخاطبان خود را بشناسید.

شناخت مخاطبان بسیار مهم است برای اینکه آنها نقش بزرگی در توسعه ی اپلیکیشن شما دارند.

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



6- استاد یک پلتفرم بشوید

یکی از مهمترین سوالات که شما باید قبل از ساخت اپلیکیشن از خود بپرسید این است که روی چند پلتفرم میخواهید اپلیکیشن خود را ارائه دهید؟ اگر شما نظر من را میخواهید، من پیشنهاد می دهم که اول یک پلتفرم را به خوبی به سرانجام برسانید و سپس روی پلتفرم های دیگر بروید.



7- روی استراتژی مارکتیگ خود تمرکز کنید

قیل از بیرون آمدن اپلیکیشن ، شما باید آن را به مردم معرفی کنید. اکثر سازندگان اپلیکیشن موبایل به شکست می خورند به دلیل آنکه برنامه مارکتیگ خاصی ندارند. به طور منتطقی، برنامه نویسان باید بازار اپلیکیشن خود را  2 الی 3 هفته از قیل از بیرون آمدن اپلیکیشن خود شروع کنند تا کاربران آشنا شوند.



8- اپلیکیشن خود را قبل از ورود به مارکت تست کنید

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

بعد از موفقیت در تست آلفا، شما می توانید که تستر های بتا را وارد عمل کنید تا بخش بعدی تست را انجام دهند. 


9- روی  توضیحات تاکید کنید

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

2 الی 3 خط اول توضیحات بسیار مهم است .


10. به طور کامل بودجه ی خود را بدانید.

تمام قدمهایی که شامل توسعه ی اپلیکیشن می شود هزینه و پول را در خود دارد. دانستن بودجه ی شما و تخصیص آن در هر مرحله توسعه بسیار ضروری است. من به شما پیشنهاد می کنم که از کسی که می تواند بودجه پروژه را تخمین بزند حتما ملاقات کنید.



امید واریم این نکات شما را در توسعه اپلیکیشن کمک کرده باشد.


منبع : www.devsaran.com


۱ نظر موافقین ۰ مخالفین ۰
ُسینا رحیمی