بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

استفاده از اسلایدینگ منو + Navigation Drawer دست ساز و خانگی (آموزش)

مدیریت گفتگو
کاشی زاده 12 سال پیش
آخرین تغییر: 8 سال پیش

آموزش ویدئویی مخصوص ساخت ActionBar بهمراه Navigation Drawer را از لینک زیر دریافت کنید .

لینک آموزش

 


سلام.

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

روش های ایجاد یک Navigation Drawer یا Sliding Menu به شرح ذیل هست :

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

jfeinstein10/SlidingMenu

nicolasjafelle/SherlockNavigationDrawer

اگر در گوگل سرچ هم بزنید بیشتر  هم وجود داره .

روش دوم ساخت یک Navigation Drawer هست با استفاده از کتابخانه خود اندروید و به صورت دست ساز.

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

برای ساخت این منو ابتدا لایبری ساپورت ورژن 4 رو به پروژه اضافی میکنیم .

بعد یک لایه جدید در ریسورس هاتون اضافی کنید مثلا به اسم main_root.xml 

حالا یک لایه دیگه به نام main.xml و یک لایه دیگه هم به نام navigation_drawer.xml

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

ابتدا لایه main.xml داخل این لایه  میتونید صفحه بندی هاتون روانجام بدید دقیقا این همون لایه ای هست که همیشه ما توش UI رو درست میکنیم یا به عبارتی  لایه Activity .

لایه  navigation_drawer.xml  هم لایه مربوط به منو شماست که با توجه به نیازی که دارید طراحی میکنید .

خب تا اینجاش ما کار خاصی انجام ندادیم و فقط لایه هامون رو درست کردیم ، در  navigation_drawer   layout  یه نکته وجود داره و اون این هست که شما باید در لایه ی پدر بهش gravity بدید مثل کد زیر :

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="@dimen/sliding_menu_width"
    android:layout_height="match_parent"
    /////////////////////////////////////// android:layout_gravity="left"
    android:layout_marginLeft="20dp"
    android:background="#2a2a2a"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:background="#be2f23"
        android:orientation="vertical" >

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="centerInside"
            android:src="@drawable/menu" />
    </LinearLayout>

    <ListView
        android:id="@+id/lst"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        tools:listitem="@layout/view_category" >

    </ListView>

</LinearLayout>

خب همونطور که در کد بالا مشخصه ما به لایه پدر یه gravity دادیم این مقدار برای این هست که مشخص کنیم منوی ما از کدوم ور باید بیاد ینی منو سمت راست باشه یا سمت چپ .

میریم سراغ main_root.xml ، شبیه به چسب عمل میکنه و 2 لایه دیگه رو به هم میچسبونه .

داخل این لایه ما از یک DrawerLayout استفاده میکنیم نحوه استفاده هم به شکل زیر هست .

 <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <include layout="@layout/main" />

    <include layout="@layout/navigation_drawer " />

</android.support.v4.widget.DrawerLayout>

خب توجه داشته باشید که همونطور که قبلا هم گفته شد شما باید از لایبری ساپورت ورژن 4 استفاده کنید .

خب اینجا 2 تا خط داریم که یکم نامهوم شاید باشه 

  <include layout="@layout/main" />

   <include layout="@layout/navigation_drawer " />

اولین خط لایه main  و دومین خط لایه navigation_drawer رو داخل لایه main_root اصطلاحا include میکنه یا میاره توش .

خب کار ما تموم شد با xml میریم سراغ کد نویسی 

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

 setContentView(R.layout.main);

مینویسید 

 setContentView(R.layout.main_root);

و با استفاده از کد زیر Drawer Layout رو بهش معرفی میکنیم :

 DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

البته این معرفی هیچ لزومی نداره همین الان شما میتونید با بردن انگشت به گوشه صفحه ، منو خودتون رو باز کنید ولی ما میخوایم یکم قشنگ تر کار کنیم و یه دکمه هم تعریف کنیم که وقتی روش کلیک شد منو باز و بسته بشه  :)

حالا یه دکمه تعریف میکنیم و براش Onclick رو Override میکنیم و کد زیر رو توش منویسیم :

       btn.setOnClickListener(new OnClickListener() {

		@Override
		public void onClick(View v) {
			if(drawerLayout.isDrawerOpen(Gravity.LEFT)){
				drawerLayout.closeDrawers();
			}else {
				drawerLayout.openDrawer(Gravity.LEFT);
			}
		}
	});

خوب توضیح کد بالا هم بدیم که دیگه کار تمومه ، if(drawerLayout.isDrawerOpen(Gravity.LEFT)) یعنی اگر منو باز بود با استفاده از این کد ببندش drawerLayout.closeDrawers();  و در غیر این صورت با استفاده از این کد زیر بازش کن :

 drawerLayout.openDrawer(Gravity.LEFT);

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

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

آخر سر شما هم چین چیزی دارید :

 

 

موفق و سربلند باشید :)

 

نظرات

Hajhosseini 12 سال پیش
ممنون از آموزشتون دوست عزیز، اینجا یک مشکل پیش میاد: اگر شما 4 اکتیویتی داشته باشید باید توی همه ی 4 تا اکتیویتی کدهایی که در منو ها ( میتونه 2 تا باشه ) اجرا میشه رو بنویسید، مثلا اگر در سمت چپ منوی تنظیمات داشته باشید و 500 خط کد تنظیماتتون باشه، باید در هر 4 اکتیویتی 500 خط کد رو کپی کنید. راهی برای حل این مشکل پیدا کردید؟
کاشی زاده 12 سال پیش
شما میتونید کد ها رو در کلاس دیگه ای بنویسید و در کلاس های مختلف فقط رفلکت اون کلاس رو استفاده کنید
Hajhosseini 12 سال پیش
توی کار با View ها مطمئن نیستم به صرفه باشه، مثلا اگر در صفحه منو انیمیشن داشتیم و یا از عکس متحرک استفاده شده بود کار سخت میشد.در کل این روش خیلی سبک تر از Library ها کار میکنه و این مزیت بزرگیه
کاشی زاده 12 سال پیش
یکم روش وقت بزاری میتونی اون مشکلم حل کنی ، 100% لایبری ها هم حجم بیشتری به برناممون میدن و هم یاعث کاهش سرعت اجرا میشن
محسن 12 سال پیش
سلام ممنون از آموزش، یه سوال! چطور میشه توی گزینه های NavDrawer زیر منوهای دیگه تعریف کرد جوری که وقتی تاچ بشه اون زیر منوها نمایش داده بشن؟
کاشی زاده 12 سال پیش
با استفاده از لیست ویو کشویی یا همون expandable listview
Hossein Kurd 12 سال پیش
چطور می تونم width مربوط به navigationDrawerرو تنظیم کنم( 10% یا 40% یا 50%)؟ هرچقدر سعی کردم یا کرش داد یا جواب نداد
کاشی زاده 12 سال پیش
براش مارجین تعریف کنید یا کد جاوا بنویسید
Hossein Kurd 12 سال پیش
برای LinearLayout که parent در navigation_drawer.xml هست؟
کاشی زاده 12 سال پیش
بله میتونید براش یا سایز دستی وارد کنید یا در دایمنز تعریف کنید یا در کد جاوا نسبت عرض صفحه رو بگیرید و براش کد بنویسید
javac 12 سال پیش
چرا DrawerLayout رو برای من شناسایی نمیکنه؟!!
javac 12 سال پیش
android support هم اضافه کردم.
کاشی زاده 12 سال پیش
ارورتون رو بنویسید ببینیم مشکل چیه
Hossein Kurd 12 سال پیش
javac آیا کامل کد رو نوشتی؟ و Android Support V4 رو هم ایمپورت کردی؟
javac 12 سال پیش
آره همه کارا رو کردم فایده نداره کلاس drawerLayout رو نمیشناسه و میگه خودت بسازش یا اضافه کن..... فعلا برگشتم به لایبرری sliding menu تا سرفرصت ببینم حرف حسابش چیه:)
Hossein Kurd 11 سال پیش
من می خوام برای بخش نمایش و ارسال پیام از Navigation Drawer استفاده کنم، اما چند مشکل وجود داره 1. با درگ در سمت راست Screen باز می شه 2. با باز شدم منو ، صفحه کنار بره و منو نمایس داده بشه مثل منو "مارکت بازار"
کاشی زاده 11 سال پیش
جوابتون رو تو یه پاسخ پایین تر میدم ، میتونید از این روش استفاده کنید : به جای DrawerLayout از SlidingPaneLayout استفاده کنید .
jamal2012 11 سال پیش
این کامپوننت (Drawer Layout)وجود نداره من ساپورت لایبرری v7رو هم ایمپورت کردمDrawer Layout کجاست؟
Spirit 11 سال پیش
android.support.v4.widget.DrawerLayout از روی این فکر کنم بفهمید کدوم supportLibrary هست :))
jamal2012 11 سال پیش
الان مخاطبت کیه؟
jamal2012 11 سال پیش
مشکل حل شد دوست من
jamal2012 11 سال پیش
ایمپورت کرده بودم فکر میکردم باید تو کامپوننت ها باید چیزی اضافه شه
Alireza_Ghamkhar 11 سال پیش
من برنامه "اینجاست" شما را دیدم. واقعا زیبا بود. فقط یه سوال واسه من پیش اومده... چطور میشه هم tab navigation و هم Sliding Navigation را پیاده سازی کرد؟ از این نظر این سوال را میپرسم که xml مربوط به main activity باید دارای lay out android.support.v4.view.ViewPager باشد و از طرفی همونظور که شما عنوان کردید برای sliding navigation باید drawer layout گذاشت. میشه یه راهنمایی کنید بی زحمت که دقیقا باید چیکار کرد؟ تو سایت خاصی سورس خاصی میشناسید که برای Api8 به بالا مثل شما اینکارو کرده باشه که بتونم استفاده کنم؟ من اومدم از view pager استفاده کردم و واسه sliding navigation از کتابخانه ای که استاد یاد دادن استفاده کردم اما متاسفانه وقتی که منوی کشویی میاد بیرون روی اکتیویتی نمیاد و تب رو میزنه کنار که قشنگ نیست...
کاشی زاده 11 سال پیش
اگر از روشی که من اسلاید منو رو اضافی کردم برید مشکل کنار زدن اکتیوتی حل میشه ، برای تب هم میتونید از امکانات خود viewPage استفاده کنید که یه تب اختصاصی در اختیارتون قرار میده . اگر از همین روش برای پیاده سازی منو و از روشی که در لینک آموزش رو قرار دادم برای اکشن بار استفاده کنید هیچ مشکلی یش نمیاد و در نسخه 10 به بالا هم پشتیبانی میشه .
best_programmer 11 سال پیش
کسی میدونه چطور میشه نویگشن بار یکسان رو برای اکثر اکتیویتی ها ست کرد؟
Hajhosseini 11 سال پیش
اگر قراره کاملا یکسان باشه یک Layout به نام actionbar بسازیر و در بقیه Layout ها ایمپورتش کنید، در کد هم یک اکتیویتی بسازید که تمام کارهای actionbar رو انجام بده و بقیه اکتیویتی ها رو از این اکتیویتی extends کنید
Delna 11 سال پیش
سلام دوستان.برای ساخت این navigation menu از ساپورت ورژن 4 استفاده میشه و برای اکشن بار از ورژن 7 .حالا اگه بخوای از دوتاش استفاده کنی این دو تا باهم تداخل پیدا نمیکنن؟یه لینک واسه دانلود ورژن 4 بدید ممنون میشم.
کاشی زاده 11 سال پیش
نیازی نیست هر دو تا لایبری رو ایمپورت کنید ، داخل لایبری ورژن 7 نسخه ورژن 4 هم موجود هست و مشکلی پیش نمیاد
Delna 11 سال پیش
پس چرا میگن وقتی ورژن7 ایمپورت میکنی باید ورژن 4 از تو پوشه libs پروژه حذف کنی که اکلیپس ایراد نگیره.دز ضمن project build target اگر بزارم روی اندروید 4 دیگه برای 2.2 اجرا نمیشه؟منظورم از همونجاس که کتابخانه رو ایمپورت میکنی.
Mostafadam1 11 سال پیش
من یه مشکل عجیب واسم پیش اومده اینکه همه کارا رو درست انجام میدم. ولی اسلاید منو رو وقتی میکشم جلو خودش برمیگرده عقب و ثابت نمی مونه. یه سوال دیگه اینکه چ طوری میشه جای لمس رو واسه بیرون کشیدن اسلاید منو بیشتر کرد یعنی الان اگه باید دست رو ببریم به سمت گوشه و بکشم . بتونیم از وسط گوشی هم اگر دست رو به سمت مقابل کشیدم اسلاید منو بیرون بیاد.
دبیری 11 سال پیش
من برنامه رو بردم داخل کلاسی از اکتیویتی که همه کلاس ها از اون کلاس extends شده باشند . تو این حالت دیگه دکمه منو کار نمیکنه و با لمس کردن هم منو باز نمیشه فقط انگار اکتیویتی اکشنبار ظاهر میشه کسی میدونه چرا ؟ و چطوری میتونم اکشن بار رو ببرم تئ همه ی اکتیویتی ها ؟
کاشی زاده 11 سال پیش
اگر درست انتقال داده باشه هیچ مشکلی پیش نمیاد و کار انجام میشه .
محمد آقا 11 سال پیش
ببخشید یه سوال داشتم، اینجور که فهمیدم برای هر صفحه ای که در موبایل قراره نشون بدم یه لایه root.xml و مثلن یه لایه main.xml و یه لایه navigationDrawer.xml باید بسازم، یعنی برای هر صفحه باید 3 تا ازینا بسازم، راهی نیست root.xml رو نسازم ؟ یعنی هردفعه root.xml رو نسازم که 2 تا لایه ی دیگه رو داخل قرار بدم ، راهی هست ؟ مثلن وقتی چند صفحه دارم و همشون قراره منو کشویی رو داشته باشن . مرسی
n.sina 11 سال پیش
این اسلایدمنو یه مشکلی داشت ،وقتی که رو فضای خالی اسلاید منو کلیک میکنی هر چیزی که زیر اون ،روی لایه اصلی برنامه باشه رو کلیک میکنه !
ayhan 11 سال پیش
با سلام دوستان من تو قسمت آخر گیر کردم وقتی دکمه رو تعریف میکنم و میرم قسمت کد نویسی مثل همیشه که رو setOnClickگزینه ایمپورت بود الان نیست مشکل چیههههه؟؟ماوس رو روش میگیر گزینه های change.....اینا میاره
SaeiD-as 11 سال پیش
@محمدحسین جان تشکر بابت این آموزش خوبت. منم مشکل @n.sina رو دارم یعنی موقعی که اسلاید منو بازه، وقتی روی فضای خالی کلیک میکنم روی لایه زیرین کلیک میخوره!! راه حلش چیه؟
احمد 11 سال پیش
اقای کاشی زاده میشه بگید دقیق چجوری اون کلاسی که برای این کدها تعریف کردیم ببریم تو یه اکتیویتی دیگه و اوانجا بعد از ساختن یک شی از اون کلاس اونا اجرا کرد مرسی بابت اموزشتون
کاشی زاده 11 سال پیش
متوجه منظورتون نشدم ، لطفا بیشتر توضیح بدید دقیقا منظورتون چی هست .
احمد 11 سال پیش
ما برای این اسلاید ده تا باتن درس می کنیم و برای هرکدوماش یه کاری... خوب این کدها را میخاییم تو یه کلاس جدید درس کنیم و بزاریم و برای هرصفحه که بخواهیم اونا را بزاریم و همینطور بحث لایه ها که کجا باید ست شوند توی همه صفحه ها یا تو همون کلاس ساخته شده....مرسی
کاشی زاده 11 سال پیش
باید لایه رو با کد در EnhancedActivity ست کنید و براش یک متد بنویسید و در هر صفحه ای که مورد نظرتون هست فقط متد رو صدا کنید و براش آیتم های مورد نظر رو قرار بدید .
فرهاد 10 سال پیش
سلام آقای کاشی زاده طبق دستور شما بارها بارها انتحان کردم ولی کرش میکنه روی این خط setContentView(R.layout.main_root); اصلا معلوم نیست این مین روت چیه
فرهاد 10 سال پیش
بعد از چند ساعت تلاش بالاخره حل شد ممنون
احمد 10 سال پیش
میگم من لایه main م بصورت لند اسکیپ هسش و میخام اسلاید منو را از پایین بیارم بالا ولی هرووقت gravity را به bottom تغییر میدم کرش میکنه میگه left or right بنظرتون باید چیکار کنم؟
احمد 10 سال پیش
از لایبرری jfeinstein10 هم ک استاد گفتن کار کردم ولی فایده نداره چجوری میشه اسلاید از پایین باز بشه ایا؟
Lion 10 سال پیش
همه ی کد ها رو تو کلاس Activity Enhanced نوشتم چون همه ی اکتیویتی هام از این کلاس اکستندز شدن برای لایه روت باید چی کار کنم تو قسمت include ؟
Atieh 10 سال پیش
سلام لینک ببخشید من از راه شما رفتم اما این ارورو میده : You must specifiy a valid layout reference. The layout ID @layout/navigation_drawer is not valid. و برنامه کرش میکنه !!! چرا آخه؟
amirhossein1376 10 سال پیش
این تاپیک مال 2 سال پیشه و بهتره شما برید سمت متریال دیزاین البته اگه میخواید کاستوم بسازید که هیچی لینک
parand 9 سال پیش
از این روش در اندروید استادیو هم میشه استفاده کرد؟

پاسخ‌ها 20

override 12 سال پیش

من از روشی که در مستندات گوگل هست استفاده کردم به نظرم روش شما آسونتره حالا چند تا سئوال دارم:

من لایه ی مربوط به navigation_drawer.xml به این صورت تعریف کردم:

 <?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />

<ListView
android:id="@+id/drawer_list"
android:layout_width="220dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="#BfE4F1FE" />

</android.support.v4.widget.DrawerLayout>

در آموزش های گوگل از فرگمنت استفاده کرده و من برای اینکه بتونم لایه ی اکتیویتی اصلی رو زیر منوی کشویی نشون بدم ،در اکتیویتی اصلی که از کلاس NavigationDrawer ارث بری شده از کد زیر استفاده کردم:

  @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

FrameLayout frameLayout = (FrameLayout)findViewById(R.id.content_frame);
View activityView = G.inflater.inflate(R.layout.main_layout, null,false);
frameLayout.addView(activityView)

اکتیویتی اصلی به عنوان یه هدایتگر به بخش های مختلف استفاده میشه ولی در این حالت با انتخاب  هر اکتیویتی که با دیتابیس سروکار داره برنامه کرش میکنه علت از کجا میتونه باشه؟

 سئوال2 : کاربرد این کدها چیه؟

 /**
* When using the ActionBarDrawerToggle, you must call it during
* onPostCreate() and onConfigurationChanged()...
*/

@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}


@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Pass any configuration change to the drawer toggls
mDrawerToggle.onConfigurationChanged(newConfig);
}

سئوال 3: برای اینکه در روش شما navigationDrawer روی ActionBar قرار نگیره باید چیکار کرد؟

 

 

 

نظرات

کاشی زاده 12 سال پیش
خب شما با استفاده از روشی که گفتم نیاز به فرگمنت ندارید و خودش منو روی اکتیویتی میاد اکتیویتی هم از زیرش پیدا هست و زیر اکشن بار هم قرار میگیره و مشکلی هم نداره این کد هایی هم که نوشتید مربوط به تنظیمات وضعیت منو هست که اگر از روش بالا استفاده کنید دیگه لزوی نداره از این کد ها استفاده کنید .
override 12 سال پیش
خیلی ممنون، میشه بیشتر توضیح بدید تنظیمات وضعیت منو، یعنی دقیقاً چی مثلاً توی اون کامنتی که ترجمه ش میشه "هر گونه تغییری در تنظیمات رو به drawer toggls میفرسته " این یعنی چی؟بعد این روش خیلی آسونتره پس چرا گوگل رفته کار رو سخت کرده مزیت روش گوگل چیه؟
کاشی زاده 12 سال پیش
من از این روش استفاده نکردم ولی به احتمال زیاد تنظیماتی که تو این شما میتونید استفاده کنید حتما بیشتر هست مثلا این حالی که من نوشتم منو میوفته روی اکتیوتی و زیر اکشن بار شاید شما بخواید منو اکتیویتی رو هل بده و بقلش بیوفته یا مثلا اکشن بار هم جا به جا به بشه . اطلاعات دقیق از این روش ندارم متاسفانه :|
override 12 سال پیش
اتفاقاً روش گوگل هم منوی کشویی فقط به همین صورت ظاهر میشه چون در هر دو روش از لایبری ساپورت ورژن 4 استفاده شده.
کاشی زاده 11 سال پیش

دوستانی که دوست دارند اسلادینگ منوشون به شکل زیر باشه میتونن از روش زیر که لینکش رو گذاشتم استفاده کنن : 

.

.

لینک

نظرات

Hossein Kurd 11 سال پیش
آیا راهی برای ثابت نگه داشتن منو در حالت باز وجود داره؟(بسته نشه)
کاشی زاده 11 سال پیش
متوجه منظورتون نشدم اگر ممکن هست مثالی واضح تر بزنید .
Hossein Kurd 11 سال پیش
در برخی مواقع می خوام SliningPaneLayout در هنگام اجرای Activity در حالت Open باشه و بسته نشه
Hossein Kurd 11 سال پیش
در برخی مواقع می خوام SliningPaneLayout در هنگام اجرای Activity در حالت Open باشه و بسته نشه
کاشی زاده 11 سال پیش
در onResume بهش بگید باز بشه ، البته من اینطوری برداشت کردم از توضیحی که دادید.
Hossein Kurd 11 سال پیش
ببین محمدحسین جان ، منو رو درگمی کنیم و باز می شه ، مارجین هم در نظر گرفتیم که مثلا تا یک چهارم صفحه باز بشه ، مساله اینجاست که در حالت LandScape نباید بسته بشه
کاشی زاده 11 سال پیش
اگر منظورتون این هست که تو حالت لند اسکیپ بچسبه کنار بقیه صفحه و ثابت باشه ، بهتره یه layout مخصوص landscape بسازی و توش به جای اینکه از SliningPaneLayout استفاده کنید یه لایه ثابت قرار بدی اینطوری تو حالت portrait منوی کشویی دارید و هم در حالت landscape منوی شما به صورت ثابت قرار میگیره .
Hossein Kurd 11 سال پیش
آخه یک حالت پورتریت هم دارم و نمی خوام کد اضافی بزنم
MEHDI007 11 سال پیش
من اینو که معرفی کردین تست کردم درست و حسابی کار نمی کنه.:(
وحید 11 سال پیش
اگر از اندروید ورژن 2.2 بخوایم استفاده کنیم باید چیکار کنیم؟
کاشی زاده 11 سال پیش
مشکلی نداره میتونید استافده کنید ، فقط نسخه Sdk target رو روی 15 تنظیم میکنیم و min Sdk رو 8 بذارید
وحید 11 سال پیش
دوستان من منظور ازین جمله رو نفهمیدم: - برای ساخت این منو ابتدا لایبری ساپورت ورژن 4 رو به پروژه اضافی میکنیم - تقریبا خط 14 از بالا می شه.
وحید 11 سال پیش
من برنامم رو با اندروید 2.2 ساختم. اینطور که متوجه شدم لایبرری ساپورت برای این هست که کسانی که اندرویدشون پایین تر از 4 مثلا هست هم بتونن استفاده کنن از این قابلیت. آیا لازم هست من این لایبرری رو اضافه کنم با این که برنامم رو با اندروید 2.2 ساختم؟
کاشی زاده 11 سال پیش
اگر به ابزاری مثل اکشن بار و یا اسلادینگ منو نیاز دارید که در ورژن های زیر 4 بتونید استفاده کنید باید لایبری رو اضافی کنید .
nooriDeveloper 11 سال پیش
@محمد حسین - خیلی ممنون از آموزش هاتون، من کدها رو بدون مشکل اجرا کردم فقط سوالی که دارم اینه که چطور این کدها رو تو یک کلاس مثل BaseMenuActivity تعریف کنم تا بتونم اکتیویتی های دیگه رو از اون ارث بری کنم؟(برای داشتن منو در تمام صفحات برنامه) مشکل اصلی هم در include کردن لایه مورد نظر در root هستش چون اینطوری مجبورم برای هر اکتیویتی یک root هم بسازم و داخلش drawer و activity رو include کنم که فکر نکنم جالب باشه. خیلی ممنون میشم اگه با کد توضیح بدید.
کاشی زاده 11 سال پیش
باید به جای استفاده از xml همه کد ها رو در جاوا بنویسید و لایه ها رو در جاوا به هم بچسبونید ،یکم پیچیده هست ولی امکان پذیر
ayhan 11 سال پیش

با سلام دوستان من آموزش sliding رو طبق کلیپ پیش رفتم میخوام بهش 3تا tabاضافه کنم ممنون میشم کمکم کنین و بگین چه کدهایی رو کجا برنامه وارد کنم ممنون میشم

نظرات

سعید 11 سال پیش

برای من ارور

DrawerLayout must be measured with MeasureSpec.EXACTLY.
Exception details are logged in Window > Show View > Error Log

میده چجوری حلش کنم؟ممنون.

نظرات

سعید 11 سال پیش
به جای فیل پرنت بهش عرض وراتفاع دادم مشکل حل شد.اما خوب اینجوری که به مشکل بر میخورم!راحل حل چیه؟
behnam2000 11 سال پیش

من فیلم اموزشی ساخت sliding menu شما رو دیدم و کاملا بدون مشکل پیاده سازی کردم.فقط یه مشکله کوچکی وجود داره به اینصورت که با زدن دکمه به درستی باز و بسته میشه و با دست هم تا زمانی که دستمان را از روی صفحه نکشیده ایم به سمت مورد نظر میتونیم بکشیم اما وقتی باز هست نمیدونم چرا نمیشه به طرف داخل با دست کشید و تنها زمانی بسته میشه که در یک جای صفحه تاچ میشه.

نظرات

parand 11 سال پیش

با سلام

من از slidingmenu  که شما آموزش دادین استفاده کردم مشکلی هم نداره

حالا یکی از منوها کاربر را به صفحه ای منتقل میکنه که دیزاین تون صفحه مثل تب های واتس اپ است که با کشیدن به چپ و راست محتوای همون fragmnet را نشان میده ولی از این خط ایراد میگیره

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

viewPager = (ViewPager) findViewById(R.id.viewPager);
        tabsAdapter = new TabsFragmentPagerAdapter(getSupportFragmentManager());
        viewPager.setAdapter(tabsAdapter);

ولی وقتی از کد زیر استفاده میکنم این خط را error میده  actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS

این هم کد کل صفحه :

package view;

import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.view.Menu;

public class HomePageActivity extends FragmentActivity implements ActionBar.TabListener {

    private ViewPager                viewPager;
    private ActionBar                actionBar;
    private TabsFragmentPagerAdapter tabsAdapter;
    private String[]                 days = new String[]{ "menu1", "menu2", "menu3", "menu4", "menu5", "menu6", "menu7", "menu8", "menu9" };


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home_activity);

       /* viewPager = (ViewPager) findViewById(R.id.viewPager);
        tabsAdapter = new TabsFragmentPagerAdapter(getSupportFragmentManager());
        viewPager.setAdapter(tabsAdapter);*/

         tabsAdapter = new TabsFragmentPagerAdapter(getSupportFragmentManager());
         viewPager = (ViewPager) findViewById(R.id.viewPager);
         viewPager.setAdapter(tabsAdapter);
         actionBar = getActionBar();
         actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
         for (int i = 0; i < 9; i++) {
             actionBar.addTab(actionBar.newTab().setText(days[i]).setTabListener(this));
         }
         viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

             @Override
             public void onPageSelected(int arg) {
                 // TODO Auto-generated method stub
                 actionBar.setSelectedNavigationItem(arg);
             }


             @Override
             public void onPageScrolled(int arg0, float arg1, int arg2) {
                 // TODO Auto-generated method stub

             }


             @Override
             public void onPageScrollStateChanged(int arg0) {
                 // TODO Auto-generated method stub

             }
         });

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        // getMenuInflater().inflate(R.menu., menu);
        return true;
    }


    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }


    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }


    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }

}

با توجه به اینکه اگر از library که استاد اموزش دادند استفاده کنم مشکلی پیش نمیاد ولی بدلیل سرعت و حجم کم ترجیح میدم از آموزش شما استفاده کنم

و سوال بعدی این هست که برای ساخت پروژه از اندروید 2.2 استفاده کردم ولی بعد از اضافه کردن library که شما معرفی کردید

(android-support-v7-appcompat) وقتی که توی قسمت properties پروژه نگاه میکنم تبدیل شده به اندورید 4 و اگر تغییر بدم به error بر میخورم  وقتی که برنامه را روی نسخه اندروید 2.2 نصب کردم متوجه شدم ، برای این شکل چه راه حلی دارید؟؟

 

نظرات

red_sky 11 سال پیش

سلام

آقای کاشی زاده ممنون از آموزش خوبتون

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

چطور باید این مشکل را برطرف کنم؟

نظرات

کاشی زاده 11 سال پیش
در فایل xml مربوطه روی لایه مورد نظر کلیک کنید و قابلیت Clickable بودن رو true کنید .
red_sky 11 سال پیش
خیلی ممنون
reza1234 11 سال پیش
با سلام در navigation_drawer قسمت زیر رو چطور پیاده کنم(view_category؟؟ - یه مثال) ممنون
reza1234 11 سال پیش
منظورم قسمت مربوط به لیست ویو هست آخه تو آموزش بخاطر ارور این قسمت(لیست ویو) رو شما پاک کردید
reza1234 11 سال پیش
آقای کاشی زاده با تشکر بنده میخوام از دیتابیس اطلاعاتی رو تو لیست ویو نشون بدم پروژه آموزشی شما رو (سورس Actionbar_SlidingMenu شما رو) ایمپورت کردم حالا هرکاری میکنم یه لیست ویو از ویجت های اندروید تو یه xml قرار بدم ارور میگیره ممکنه راهنمایی کنید(تم همون تم Theme.AppCompatو تنظیمات اندروید تو ایکلیپس هم 2.2) است
کاشی زاده 11 سال پیش
چه اروری میده از صفحه ای که ارور میده عکس بگیرید و در پاسخی جداگانه قرار بدید .
uncolove 11 سال پیش
منم همین مشکل reza1234 رو دارم، با این تم وقتی listview نمیونم به layout اضافه کنم و error میده.
سجاد 10 سال پیش

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

نظرات

red_sky 10 سال پیش
خیلی راحت مثل تمام آیتم های دیگه ای تعریف میکنیم اون آیتم ها هم تعریف کنید و براشون متد onClickLisener را بنویسید
سجاد 10 سال پیش
امكانش هست يه نمونه واسم قرار بديد. البته فقط اضافه كردن آيتم منو رو نميخوام. اينكه بشه با كليك روي اون آيتم اكتيويتي جديد باز بشه. اگه ممكنه يه نمونه قرار بديد، خيلي سر اين موضوع گير كردم و نياز فوري هم دارم.
red_sky 10 سال پیش
اگه طبق این آموزش ها کار را انجام داده باشید که نباید توی اضافه کردن آیتم مشکلی داشته باشید توی فایل xml با استفاده از textview و و اگه مایل به نمایش آیکن هم کنار متن باشید imageview آیتم ها را میسازید حالا تووی اکتیویتی که این اسلاید منو داخلش استفاده شده مثل همیشه که یک textview را معرفی میکنید اینجا هم دقیقا همونطوری معریفیش میکنید هیچ فرقی با قبل نداره و براش متد onClickListener را فراخوانی میکنید و با استفاده از intent اکتیوتی مورد نظرتون را اجرا میکنید
سجاد 10 سال پیش
آها يعني توي لايه اي كه اسلايد منو طراحي شده آيتم ها رو قرار بدم واسشون clickListener تعيين كنم و با startInetnt صداشون كنم؟! اگه اينقدر راحت باشه كه خيلي عالي ميشه. باشه امتحان ميكنم اگه نشد باز مزاحم ميشم. ممنون از لطفتون.
red_sky 10 سال پیش
بله به همین راحتیه
سجاد 10 سال پیش
خسته نباشید. ببخشید مزاحم شدم. خب من الان همینکار رو کردم. و واسه اسلایدمنو آیتم هایی قرار دادم و طبق گفته ی شما توی همون اکتیویتی که اسلایدمنو رو ساختم واسش رویداد کلیک قرار دادم. طبق کد زیر: LinearLayout layout_home = (LinearLayout) findViewById(R.id.layout_home); layout_home.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Intent intent = new Intent(getApplicationContext(), ActivitySecond.class); startActivity(intent); } }); layout_home در واقع یه Linear Layout هست که شامل آیکون و عنوان آیتم هست. ولی اجرا کردم به فورس کلوز انجامید.
red_sky 10 سال پیش
ارور logcat را بخونید تا ببینیم مشکل کجاست
mohsen-jj 10 سال پیش

سلام دوستان . من دارم رو یه پروژه کار می کنم که صفحاتش fragement هستند . دوتا sliding menu پیدا کردم روی اکتیویتی هایی که از Activity ارث بری می کنند درست کار میکنن ولی روی fragement ها نه .

مثلا یکی از این sliding menu ها توی این خط ارور میده و هرکاری کردم مشکلش حل نشد :

کسی راه حل رو میدونه ؟

 menu.attachtoActivity();


نظرات

سجاد 10 سال پیش

red_sky

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

        LinearLayout layout_home = (LinearLayout) findViewById(R.id.layout_home);
        layout_home.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                Intent intent = new Intent(getApplicationContext(), ActivitySecond.class);
                startActivity(intent);
            }
        });

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

نظرات

tiam 10 سال پیش

با تشکر از آقای کاشی زاده اگه براتون ممکن ایجاد اسلاید منو در چند صفحه رو یه مثال بزنید ممنون میشم

نظرات

118674 10 سال پیش

با سلام خدمت جناب کاشی زاده - با تشکر از آموزشتون - من پروژه را موفق اجرا کردم اما میخواهم نویگیشن منو از سمت راست باز بشه

نظرات

Reza 10 سال پیش
سلام ، ویژگی layout_gravity لایه navigation_drawer.xml رو Gravity.Right بذار و وقتی میخوای بازش کنی بنویس drawerLayout.openDrawer(Gravity.Right);
118674 10 سال پیش
خیلی ممنون داداش - درست شد !!!!!
118674 10 سال پیش

سلام و خسته نباشید - چطور میشه وقتی نویگیشن منو باز میشه روی اکشن بار بیفته ؟ با تشکر

نظرات

khanbeiki 10 سال پیش

سلام . من عین فیلم رفتم اما چندتا مشکل دارم .

1- در اکشن بار طبق تصویر از دو طرف خالی میمانه. و چون از اندروید استودیو استفاده میکنم اکشن بار پیش فرض پشتش میمانه. اینو چ کنم ؟
2- اسلایدینگ منو اصلا حرکت نمیکنه و با اجرای برنامه باز میمانه و بسته نمیشه .
3- وقتی روی دکمه کلیک میکنم بسته ک نمیشه هیچ ، کرش میکنه.

البته لازم بذکر است اون لایبریی ها را اظافه نکردم چون در اندروید استودیو AppCompad وجود داشت بطور پیش فرض.

نظرات

khanbeiki 10 سال پیش
کسی نمیدونه داستان من چیه ؟
MeY3am 10 سال پیش
لیوتی که اکشن بار در اون قرار داره رو براش padding و margin ست کردین !
hossein 10 سال پیش

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

من تمام کامنت ها و پاسخ ها رو خوندم تمام اینا که گفته شد درباره ورژن 2 هست حالا اگه همون ابتدا بخوایم از ورژن 4 استفاده کنیم و نیاز به اضافه کردن کتابخونه نباشه باید چطور یه drawer menu بسازیم؟

یکم راهنمایی و  یا یه آموزش معرفی میکنید درباره این کار در ورژن 4

تشکر

نظرات

afr_msb 10 سال پیش

سلام ممنون آقای کاشی زاده بابت آموزشتون

فقط یه مشکل اساسی من فرم rootاز main و slidingmenu ارث میبرد این تا اینجا . حالا میخوام روی main و sliding menu دکمه تعریف کنم که با کلیک روی آن عملیات خاص خود را انجام دهد . من آمدم و در xml های مربوطه دکمه ها را گذاشتم حالا کداشونا مثلا main تو اکتیویتیه خودش بذارم اجرا نمیشه باید چکار کنم ؟

 

نظرات

Criss 10 سال پیش
چند نکته وجود داره : اکتیویتی شما باید با root.xml که شامل main.xml و sliding_menu.xml هست SetContent شده باشه ، بعد از اون میتونید از هر دوی اینها findView کنید ترتیب بالا و پایین بودن include شدن از لایه root مهم هست ، در صورتی که بهترتب رعایت نشه کلیک شدن روی لایه انجام نمیشه ، کلیک هایی که روی لایه sliding_menu.xml انجام میشه اگر توی اون قسمت OnclickListener تعریف نشده باشه کلیک از لایه رد میشه و روی لایه زیرین تاثیر میزاره ، که یک راه حل ساده این هست که برای لایه کلی در sliding_menu.xml کلیک لیستنر بصورت خالی تعریف کنید
afr_msb 10 سال پیش
خب من متوجه شدم همه کدها باید در action bar نوشته شود . تو تعریف root اون لایه ای که آخر کلیک را قبول میکنه . چه کنم که هم main هم navigation هر دو کلیک را قبول کنند؟
Criss 9 سال پیش

در لایبری استاد برای jfeinstein قابلیت TOUCH_MODE وجود داشت که میشد مقدار حساسیت رو برای SlidingMewnu رو مقداری برابر FullScreen قرار داد در DrawerLayout میتونید این مقدار رو به دلخواه تغییر بدید :

 
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

try {
Field mDragger = drawerLayout.getClass().getDeclaredField("mLeftDragger");//mRightDragger or mLeftDragger based on Drawer Gravity
mDragger.setAccessible(true);
ViewDragHelper draggerObj = (ViewDragHelper) mDragger.get(drawerLayout);

Field mEdgeSize = draggerObj.getClass().getDeclaredField("mEdgeSize");
mEdgeSize.setAccessible(true);
int edge = mEdgeSize.getInt(draggerObj);

mEdgeSize.setInt(draggerObj, edge * 3); //any int value you want
} catch (Exception e) {
e.printStackTrace();
}

 

نظرات

شیخی 8 سال پیش

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

من یه مشکلی دارم در اجرای اسلاید منوها؛ وقتی روی منوی سمت چپ کلیک میکنم خود به خود بسته میشه!

نظرات

116236 8 سال پیش

سلام

من به این ارور برخورد کردم:

error parsing XML:unbound prefix

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

اینم اسکرین شات صفحه. ممنون میشم  اگه کمکم کنید.

نظرات

hamcalas 8 سال پیش

این طور امتحان کنید

<?xml version="1.0" encoding="utf-8"?>
<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"

tools:openDrawer="start">

    <include layout  layout="@layout/main"/>
    <include layout  layout="@layout/menu"/>



</android.support.v4.widget.DrawerLayout>

 

نظرات

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

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .