آموزش ساخت Navigation Drawer متریال دیزاین در برنامه نویسی اندروید
سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش ساخت Navigation Drawer متریال دیزاین در برنامه نویسی اندروید می پردازیم در ادامه با ما همراه باشید.
در این جا ما 3 تا فرگمنت داریم که کاربر با کلیک کردن منو وانتخاب یکی از sub منو ها وارد آن فرگمنت ها میشه بدون افکت باز شدن اکتیویتی یعنی عملی شبیه به tab اتفاق می افتد. و ما برای بهتر شدن پروژه (متریال شدنش) از recyclerView نیز استفاده کردیم.
پس مثل همیشه وارد build.gradle شده (module) و در بخش dependencies کتاب خانه های زیر را اضافه کنید.
1 | compile 'com.android.support:recyclerview-v7:22.2.+' |
سپس پروژه را sync کنید علت خطاهای گریدل را قبلا بررسی کرده ایم.
در ایتدا باید فایل های مربوط به layout و Navigation Drawer و فرگمنت ها را ایجاد می کنیم.
پس فایل activity_main.xml ما همانند زیر می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:id="@+id/container_toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <include android:id="@+id/toolbar" layout="@layout/toolbar" /> </LinearLayout> <FrameLayout android:id="@+id/container_body" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" /> </LinearLayout> <fragment android:id="@+id/fragment_navigation_drawer" android:name=".FragmentDrawer" android:layout_width="@dimen/nav_drawer_width" android:layout_height="match_parent" android:layout_gravity="start" app:layout="@layout/fragment_navigation_drawer" tools:layout="@layout/fragment_navigation_drawer" /> </android.support.v4.widget.DrawerLayout> |
همانطور که میبیند یک LinearLayout است در ابتدا که همان صفحه اصلی ما میشود سپس داخل آن یک LinearLayout دیگر قرار دادیم تا Toolbar را در آن جا بندازیم و FrameLayout هم صفحه اصلی میشه در زیر toolbar هر چیزی در آن قرار دهید با اجرای برنامه به شما نمایش داده می شود و در آخر هم یک fragment ایجاد کردیم و این فرگمنت ما سفارشی است پس باید یک فایل به نام fragment_navigation_drawer.xml درست کرده و کد های زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/white"> <RelativeLayout android:id="@+id/nav_header_container" android:layout_width="match_parent" android:layout_height="140dp" android:layout_alignParentTop="true" android:background="@color/colorPrimary"> <ImageView android:layout_width="70dp" android:layout_height="70dp" android:src="@drawable/ic_profile" android:scaleType="fitCenter" android:layout_centerInParent="true" /> </RelativeLayout> <android.support.v7.widget.RecyclerView android:id="@+id/drawerList" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/nav_header_container" android:layout_marginTop="15dp" /> </RelativeLayout> |
کد بالا همون بخش menu رو درست می کنه یعنی وقتی روی menu کلیک کنید Navigation در آور باز می شود و محتوایت آن می باشد که شامل یک عکس و یک RecyclerView است خود این Recyclerview سه بخش ایجاد می کند که با کلیک بروی آنها وارد فرگمنت های دیگه می شویم.
حالا باید ستون مربوط به Navigation Drawer رو درست کنیم پس یک فایل به نام nav_drawer_row.xml درست کنید کد زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?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="wrap_content" android:clickable="true"> <TextView android:id="@+id/title" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingLeft="30dp" android:paddingTop="10dp" android:paddingBottom="10dp" android:textSize="15dp" android:textStyle="bold" /> </RelativeLayout> |
دوستان یادم رفت در ابتدا ما از Toolbar استفاده کردیم برای اینکه toolbar برای شما خطا ندهد در همان پوشه layout یک فایل به نام toolbar.xml درست کنید کد زیر رو در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 | <?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" xmlns:local="http://schemas.android.com/apk/res-auto" android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="?attr/actionBarSize" android:background="?attr/colorPrimary" local:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" local:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> |
تا اینجا بخشی از کار تموم شده حالا ما باید سه تا فرگمنت درست کنیم این فرگمنت های میشه Layout هر کدام از منو ها یعنی وقتی وارد منو شدید سه تا آیتم میبینید با کلیک روی هر کدام یکی از این فرگمنت ها باز می شود.
پس فرگمنت هایی به نام fragment_friends.xml , fragment_home.xml و fragment_messages.xml ایجاد کنید.
پس فایل fragment_home.xml همانند زیر می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <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:orientation="vertical" tools:context=".HomeFragment"> <TextView android:id="@+id/label" android:layout_alignParentTop="true" android:layout_marginTop="100dp" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:textSize="45dp" android:text="HOME" android:textStyle="bold"/> <TextView android:layout_below="@id/label" android:layout_centerInParent="true" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="12dp" android:layout_marginTop="10dp" android:gravity="center_horizontal" android:text="Edit fragment_home.xml to change the appearance" /> </RelativeLayout> |
و فایل fragment_friends.xml همانند زیر
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <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:orientation="vertical" tools:context=".FriendsFragment"> <TextView android:id="@+id/label" android:layout_alignParentTop="true" android:layout_marginTop="100dp" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:textSize="45dp" android:text="FRIENDS" android:textStyle="bold"/> <TextView android:layout_below="@id/label" android:layout_centerInParent="true" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="12dp" android:layout_marginTop="10dp" android:gravity="center_horizontal" android:text="Edit fragment_friends.xml to change the appearance" /> </RelativeLayout> |
و در آخر fragment_messages.xml هم همانند زیر می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <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:orientation="vertical" tools:context="info.androidhive.materialdesign.activity.MessagesFragment"> <TextView android:id="@+id/label" android:layout_alignParentTop="true" android:layout_marginTop="100dp" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:textSize="45dp" android:text="MESSAGES" android:textStyle="bold"/> <TextView android:layout_below="@id/label" android:layout_centerInParent="true" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="12dp" android:layout_marginTop="10dp" android:gravity="center_horizontal" android:text="Edit fragment_messages.xml to change the appearance" /> </RelativeLayout> |
برویم به بخش کد برنامه برای handle کردن Navigation Drawer و بقیه کار ها ابتدا یک فایل به نام MainActivity.java ایجاد کنید کد زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | package ir.programchi; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Toast; import info.androidhive.materialdesign.R; public class MainActivity extends AppCompatActivity implements FragmentDrawer.FragmentDrawerListener { private static String TAG = MainActivity.class.getSimpleName(); private Toolbar mToolbar; private FragmentDrawer drawerFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mToolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(mToolbar); getSupportActionBar().setDisplayShowHomeEnabled(true); drawerFragment = (FragmentDrawer) getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer); drawerFragment.setUp(R.id.fragment_navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout), mToolbar); drawerFragment.setDrawerListener(this); displayView(0); } @Override public void onDrawerItemSelected(View view, int position) { displayView(position); } private void displayView(int position) { Fragment fragment = null; String title = getString(R.string.app_name); switch (position) { case 0: fragment = new HomeFragment(); title = getString(R.string.title_home); break; case 1: fragment = new FriendsFragment(); title = getString(R.string.title_friends); break; case 2: fragment = new MessagesFragment(); title = getString(R.string.title_messages); break; default: break; } if (fragment != null) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.container_body, fragment); fragmentTransaction.commit(); getSupportActionBar().setTitle(title); } } } |
در ابتدا view مربوط به toolbar را به دست آوردیم و از setSupportActionBar برای قرار دادن (فعال کردن) toolbar استفاده کردیم ولی به زبان ساده تولباری را که ساپورت می شود فعال می کند سپس view مربوط به Navigation drawer را که ساختیم به دست آوردیم از setUp برای فعال کردن باز شدن meni در زمانی که بروی toolbar کلیک شد استفاده کردیم و کد زیر
1 | displayView(0); |
باعث باز شدن تولبار در هنگام باز شدن اپ می شود.
از void که در بالا displayView نام دارد برای رفتن به فرگمنت های مختلف استفاده کردیم و برای بهتر شدن کار ما تایتل رو هم عوض می کنیم یعنی هر اکتیویتی که بریم Title مربوط به toolbar تغییر خواهد کرد.
از FragmentManager برای replace کردن یک fragment جدید در هر بار استفاده کردیم. چون وقتی وارد اولین فرگمنت شوید اگر بخواهید وارد دومی شوید باید قبلی حذف شده و جدید جای آن را گیرد.
کد جاوای مربوط به فرگمنت Navigation Drawer هم همانند زیر می شود. پس یک فایل به نام FragmentDrawer.java ایجاد کرده و کد های زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | package ir.programchi; /** * Created by Jefferson on 29/07/15. */ import android.content.Context; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.view.GestureDetector; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import java.util.ArrayList; import java.util.List; import ir.programchi.R; import ir.programchi.NavigationDrawerAdapter; import ir.programchi.NavDrawerItem; public class FragmentDrawer extends Fragment { private static String TAG = FragmentDrawer.class.getSimpleName(); private RecyclerView recyclerView; private ActionBarDrawerToggle mDrawerToggle; private DrawerLayout mDrawerLayout; private NavigationDrawerAdapter adapter; private View containerView; private static String[] titles = null; private FragmentDrawerListener drawerListener; public FragmentDrawer() { } public void setDrawerListener(FragmentDrawerListener listener) { this.drawerListener = listener; } public static List<NavDrawerItem> getData() { List<NavDrawerItem> data = new ArrayList<>(); for (int i = 0; i < titles.length; i++) { NavDrawerItem navItem = new NavDrawerItem(); navItem.setTitle(titles[i]); data.add(navItem); } return data; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // drawer labels titles = getActivity().getResources().getStringArray(R.array.nav_drawer_labels); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflating view layout View layout = inflater.inflate(R.layout.fragment_navigation_drawer, container, false); recyclerView = (RecyclerView) layout.findViewById(R.id.drawerList); adapter = new NavigationDrawerAdapter(getActivity(), getData()); recyclerView.setAdapter(adapter); recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), recyclerView, new ClickListener() { @Override public void onClick(View view, int position) { drawerListener.onDrawerItemSelected(view, position); mDrawerLayout.closeDrawer(containerView); } @Override public void onLongClick(View view, int position) { } })); return layout; } public void setUp(int fragmentId, DrawerLayout drawerLayout, final Toolbar toolbar) { containerView = getActivity().findViewById(fragmentId); mDrawerLayout = drawerLayout; mDrawerToggle = new ActionBarDrawerToggle(getActivity(), drawerLayout, toolbar,"Opend","Closed") { @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); getActivity().invalidateOptionsMenu(); } @Override public void onDrawerClosed(View drawerView) { super.onDrawerClosed(drawerView); getActivity().invalidateOptionsMenu(); } @Override public void onDrawerSlide(View drawerView, float slideOffset) { super.onDrawerSlide(drawerView, slideOffset); toolbar.setAlpha(1 - slideOffset / 2); } }; mDrawerLayout.setDrawerListener(mDrawerToggle); mDrawerLayout.post(new Runnable() { @Override public void run() { mDrawerToggle.syncState(); } }); } public static interface ClickListener { public void onClick(View view, int position); public void onLongClick(View view, int position); } static class RecyclerTouchListener implements RecyclerView.OnItemTouchListener { private GestureDetector gestureDetector; private ClickListener clickListener; public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final ClickListener clickListener) { this.clickListener = clickListener; gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { return true; } @Override public void onLongPress(MotionEvent e) { View child = recyclerView.findChildViewUnder(e.getX(), e.getY()); if (child != null && clickListener != null) { clickListener.onLongClick(child, recyclerView.getChildPosition(child)); } } }); } @Override public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { View child = rv.findChildViewUnder(e.getX(), e.getY()); if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) { clickListener.onClick(child, rv.getChildPosition(child)); } return false; } @Override public void onTouchEvent(RecyclerView rv, MotionEvent e) { } @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } } public interface FragmentDrawerListener { public void onDrawerItemSelected(View view, int position); } } |
getData ایتم های Navigation Drawer را آماده می می کند.
setUp هم برای انجام عملیات ایجاد fragment و در بالا ما یک RecyclerView اگر یادتان باشید تعریف کردیم چون Recyclerview یک object خاص است باید از Touchevent استفاده کنیم تا زمانی که کاربر بروی ایتم های درون Recyclerview کلیک کرد ما بتوانیم position هر کدام از آنها را به دست آورده و fragment مربوط به آن را باز کنیم .
قبلا از اینکه ما کلاس بالا را ایجاد کنیم باید یک آداپتور و یک model ایجاد کنیم (علت ایجاد آنها را حدودا پنج بار گفته ایم می توانید در پست های قبلی آن را مطالعه کنید)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | package ir.programchi; /** * Created by Jeffetson on 29/07/15. */ import android.content.Context; import android.view.LayoutInflater; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import java.util.Collections; import java.util.List; import ir.programchi.R; import ir.programchi.NavDrawerItem; public class NavigationDrawerAdapter extends RecyclerView.Adapter<NavigationDrawerAdapter.MyViewHolder> { List<NavDrawerItem> data = Collections.emptyList(); private LayoutInflater inflater; private Context context; public NavigationDrawerAdapter(Context context, List<NavDrawerItem> data) { this.context = context; inflater = LayoutInflater.from(context); this.data = data; } public void delete(int position) { data.remove(position); notifyItemRemoved(position); } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = inflater.inflate(R.layout.nav_drawer_row, parent, false); MyViewHolder holder = new MyViewHolder(view); return holder; } @Override public void onBindViewHolder(MyViewHolder holder, int position) { NavDrawerItem current = data.get(position); holder.title.setText(current.getTitle()); } @Override public int getItemCount() { return data.size(); } class MyViewHolder extends RecyclerView.ViewHolder { TextView title; public MyViewHolder(View itemView) { super(itemView); title = (TextView) itemView.findViewById(R.id.title); } } } |
و کد مربوط به به Model همانند زیر می شود پس یک فایل به نام NavDrawerItem.java ایجاد کنید کد زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | package ir.programchi; /** * Created by Jefferson on 29/07/15. */ public class NavDrawerItem { private boolean showNotify; private String title; public NavDrawerItem() { } public NavDrawerItem(boolean showNotify, String title) { this.showNotify = showNotify; this.title = title; } public boolean isShowNotify() { return showNotify; } public void setShowNotify(boolean showNotify) { this.showNotify = showNotify; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } } |
کد بالا به getter و setter معروف است.
بیشتر کار تمام شده است حالا فقط باید Fragment ها رو ایجاد کنیم.
یک فرگمنت به نام FriendsFragment.java ایجاد کنید کد زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | package ir.programchi; import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import info.androidhive.materialdesign.R; /** * Created by jefferson on 29/07/15. */ public class FriendsFragment extends Fragment { public FriendsFragment() { // Required empty public constructor } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_friends, container, false); // Inflate the layout for this fragment return rootView; } @Override public void onAttach(Activity activity) { super.onAttach(activity); } @Override public void onDetach() { super.onDetach(); } } |
کار خاصی در فرگمنت انجام نداده ایم در صورتی که کد بالا را متوجه نشدید آموزش فرگمنت در سایت هست.
فایل فرگمنت بعدی ما HomeFragment.java است پس کد زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | package ir.programchi; /** * Created by jefferson on 29/07/15. */ import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import info.androidhive.materialdesign.R; public class HomeFragment extends Fragment { public HomeFragment() { // Required empty public constructor } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_home, container, false); // Inflate the layout for this fragment return rootView; } @Override public void onAttach(Activity activity) { super.onAttach(activity); } @Override public void onDetach() { super.onDetach(); } } |
و آخرین فرگمن ما که نامش برابر با MessagesFragment.java را ایجاد کرده و کدهای زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | package ir.programchi; import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import info.androidhive.materialdesign.R; /** * Created by jeffeston on 29/07/15. */ public class MessagesFragment extends Fragment { public MessagesFragment() { // Required empty public constructor } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_messages, container, false); // Inflate the layout for this fragment return rootView; } @Override public void onAttach(Activity activity) { super.onAttach(activity); } @Override public void onDetach() { super.onDetach(); } } |
کد های مربوط به فایل dimes.xml که در فولدر res/values قرار دارد در صوتی که وجود نداشت فایلی با همین نام ایجاد کنید.
1 2 3 4 5 6 | <resources> <!-- Default screen margins, per the Android Design guidelines. --> <dimen name="activity_horizontal_margin">16dp</dimen> <dimen name="activity_vertical_margin">16dp</dimen> <dimen name="nav_drawer_width">260dp</dimen> </resources> |
کد های مربوط به string.xml هم همانند زیر می باشد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <resources> <string name="app_name">Material Design by programchi.ir</string> <string name="action_settings">Settings</string> <string name="action_search">Search</string> <string name="drawer_open">Open</string> <string name="drawer_close">Close</string> <string name="nav_item_home">Home</string> <string name="nav_item_friends">Friends</string> <string name="nav_item_notifications">Messages</string> <!-- navigation drawer item labels --> <string-array name="nav_drawer_labels"> <item>@string/nav_item_home</item> <item>@string/nav_item_friends</item> <item>@string/nav_item_notifications</item> </string-array> <string name="title_messages">Messages</string> <string name="title_friends">Friends</string> <string name="title_home">Home</string> </resources> |
این آموزش هم به پایان رسید.
موفق باشید.
با سلام و تشکر
اگر قبل از آموزش یه تصویر یا یک گیف از نتیجه کار وجود داشته باشه درکش خیلی راحت تره
بیشتر آموزش ها پیش نمایش دارند ولی سعی می کنیم برای همه پست ها ایجاد کنیم.
سلام و عرض خسته نباشید …
لطف کنید نتیجه کار رو بزارید که بیننده ها ببینن کاری ک شما کردین چه نتیجه ای داشته که ایا به دردشون میخوره که آموزش رو دنبال کنند یا برن سراغ آموزش دیگه ای …
مچکرم
سلام و درود بیشتر آموزش های پیش نمایش به صورت gif دارند یا برای آنها فیلم قرار داده ایم در صورت امکان برای بقیه نیز پیش نمایش قرار خواهیم داد.
سلام
یه اررور برنامه تو خط زیر داره
(“mDrawerToggle = new ActionBarDrawerToggle(getActivity(), drawerLayout, toolbar,”Opend”,”Closed
به opend و closed گیر میده
دلیلش چیه؟
سلام حتما تعریفش نکردید حذف خط بالا در برنامه مشکلی ایجاد نمی کند.
چطور تعریفش کنم ؟
یه خط نیست یه سری تابع هم داخلش تعریف کردید
خط 97 تا 123 کلاس FragmentDrawer شامل میشه
بروی همان خط که هستید(باید در موقعیتی قرار بگیرید که یک علامت قرمز رنگ در سمت چپ برای شما ظاهر شود) کلید Alt+Enter را زده و اولین گزینه را انتخاب کنید خطا برطرف می شود.
و دقت کنید در برنامه یک عکس استفاده شده است که در اینجا قرار نگرفته است ممکن است خطای شما به خاطر آن عکس باشد فایل fragment_navigation_drawer.xml را بررسی کنید.
زدم خطا بر طرف نشد
اون عکسو برداشتم کلا مشکل از اون نیست
import ها را به درستی انجام دادید ؟ نباید دیگر ir.programchi باشد بلکه باید نام پکیج خودتان باشد.
بله درستش کردم اونارو
میشه فایل پروژه رو قرار بدید که دانلودش کنم ؟
امکان قرار دادن سورس فعلا وجود ندارد.
به ایمیلم هم نمیشه بفرستید؟
aliavatefi8@gamil.com
خیر شرمنده سورس برنامه ها در حال قرارگیری در بخش فروشگاه سایت است امکان ارسال وجود ندارد موفق باشید.
سلام ، بجای “Opend” , “Closed” اینا رو وارد کن :
R.string.drawer_open ,R.string.drawer_close
سلام
import info.androidhive.materialdesign.R;
import ir.programchi.R;
import ir.programchi.NavDrawerItem;
این متد ها کار نمیکنه ! چرا؟من اسم پکیج رو به اسم پکیج پروژه م تغییر دادم و اون عکس ها رو گذاشتم ..اما بازم خطا داره!!!!
سلام و عرض خسته نباشید این متد addOnItemTouchListener کارش چیه؟ و متد onclick و onlongclickزو میشه توضیح بدین؟
سلام پروژه چند تا از خطاهای بالا رو داشت همانطور که گفتید کد ها رو تغییر دادم ارور ها برطرف شد ولی پروژه stopp می شه یعنی اصلا اجرا نمی شه ،مشکل چی هست؟
میتونید از logcat ببیند دلیل stop شدن برنامه چیه..
سلام و تشکر از آموزش های خوب و کامل شما
من وقتی می خوام کتابخانه ‘com.android.support:recyclerview-v7:22.1.0’ رو کامپایل کنم ارور زیر رو می ده لطفا راهنماییم کنین با تشکر
This support library should not use a different version (22) than the compileSdkVersion (24) less… (Ctrl+F1)
There are some combinations of libraries, or tools and libraries, that are incompatible, or can lead to bugs. One such incompatibility is compiling with a version of the Android support libraries that is not the latest version (or in particular, a version lower than your targetSdkVersion.)
ورژنی که استفاده میکنید پایین تر از حد استاندارد این کتابخونس.تو بخش خطا گزینه install هست که در صورتی که ندارید براتون دانلود میکنه.
سلام من تو دوتا متد ActionBar.setTitle(java.lang.CharSequence) و setDisplayShowHomeEnabled(true) ارور های زیر رو داخل لوگ کت دریافت می کنم
java.lang.RuntimeException: Unable to start activity ComponentInfo{ir.akoit.modio/ir.akoit.modio.TopLevelActivity2}: java.lang.NullPointerException: Attempt to invoke virtual method ‘void android.support.v7.app.ActionBar.setTitle(java.lang.CharSequence)’ on a null object reference
و
java.lang.RuntimeException: Unable to start activity ComponentInfo{ir.akoit.modio/ir.akoit.modio.TopLevelActivity2}: java.lang.NullPointerException: Attempt to invoke virtual method ‘void
android.support.v7.app.ActionBar.setDisplayShowHomeEnabled(boolean)’ on a null object reference
لطفا راهنمایی کنید
سپاس
این ارور رو هم دریافت می کنم
java.lang.RuntimeException: Unable to start activity ComponentInfo{ir.akoit.modio/ir.akoit.modio.TopLevelActivity2}: java.lang.NullPointerException: Attempt to invoke virtual method ‘void android.support.v7.widget.Toolbar.setTitle(java.lang.CharSequence)’ on a null object reference
اشتباه cast کردین به احتمال زیاد.
سلام
من یک اکتیویتی جدید ساختم از نوع نویگیشن دراور . میخوام این نویگیشن خود اندروید روی صفحه من باشه که دوتا تب داره و هر تب ریسایکلر داره. وقتی فرگمنت های تب هامو اینکلود میکنم به نویگیشن دراورم . نویگیشن نمایش داده میشه اما ریسایکلرم اسکرول نمیخوره و کامل نمایش داده نمیشه
اگه کدتون رو در قالب فایل قرار بدین بهتر میتونیم کمک کنیم..همچنین بخش لایوت رو..
سلام
برنامه ی من موقع اجرا کرش میکنه خود کد هیچ ارروری نداره و اصلا هیچ خطی قرمز نیست ولی بعد از کرش تپ قسمت لاگ میگه
at com.example23.sobhan.myapplication.MainActivity.onCreate(MainActivity.java:27)
مشکل چیه؟؟؟؟
سلام
خط 27 مربوط به MainActivity رو قرار بدید ببینم علت چیست
سلام ممنون از آموزشی که گذاشتید ببخشید یه سوال داشتم برای راست چین کردن navigation باید چه کرد؟نمیخوام کل صفحه راست چین بشه فقط navigation drawer راست چین بشه ممنون میشم اگر جواب بدید
سلام و درود از آموزش هایی که قرار دادیم استفاده کنید
موفق باشید.
سلام و درود از لینک زیر استفاده کنید.
http://programchi.ir/?s=rtl+navigation
موفق باشید.
سلام ممنون از اموزش خوبتون یه سواال مهم داشتم برای پروژه ام… Navigation Drawer که ساختم بعد ایکون دانلود کردم و گذاشتم .. ولی ایکون ها رو به همین شکل سیاه و سفید نشون میده علتش چی هست؟؟ اصن این امکان هست که ایکون رنگی بشه گذاشت؟؟؟
سلام خیر آیکون رنگی در این نسخه کار نمی کنه چون به صورت پیشفرض آیکون ها بی رنگ می شوند یا اینکه شما می توانید به آنها رنگ دهید که زیاد فرقی نمی کند همش به یک رنگ تبدیل می شوند در صورتی که بخواهید آیکون رنگی قرار دهید از آموزشی که در لینک زیر قرار دارد استفاده کنید.
https://programchi.ir/2018/03/28/%d8%a2%d9%85%d9%88%d8%b2%d8%b4-navigation-drawer-%d9%81%d8%a7%d8%b1%d8%b3%db%8c-%d8%b1%d8%a7%d8%b3%d8%aa-%da%86%db%8c%d9%86-%d8%af%d8%b1-%d8%a7%d9%86%d8%af%d8%b1%d9%88%db%8c%d8%af/
اموزش های مرتبط با Navigation Drawer
http://programchi.ir/?s=navigation
موفق باشید.