استفاده از Sliding Menu در چند اکتیویتی
با سلام
در صورتیکه بخواهیم از Sliding Menu در برنامه ای شامل چند اکتیویتی استفاده کنیم چه باید کرد تا از تکرار کدهای مربوط به فراخوانی
Sliding Menu و کلیک روی آیتم های آن جلوگیری کرد .
سلام
public class CustomizedSlidingMenu extends SlidingMenu {
public CustomizedSlidingMenu(final Activity Activity) {
super(Activity);
View view = G.inflater.inflate(R.layout.sliding_menu, null);
this.setMode(SlidingMenu.LEFT);
this.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);
this.setBehindOffset(120);
this.setFadeDegree(0.35f);
this.attachToActivity(Activity, SlidingMenu.SLIDING_CONTENT);
this.setMenu(view);
}
}
حالا هرجا که خواستی از slidingmenu استفاده کنی کافیه کد زیر رو وارد کنی
CustomizedSlidingMenu slidingMenu = new CustomizedSlidingMenu(G.currentActivity);
خطای زیر دریافت میشه و برنامه اجرا نمیشه :
04-06 13:48:05.419: E/AndroidRuntime(2220): FATAL EXCEPTION: main
04-06 13:48:05.419: E/AndroidRuntime(2220): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.negahetazehco.MothersDay/com.negahetazehco.MothersDay.ActivityHome}: java.lang.NullPointerException
04-06 13:48:05.419: E/AndroidRuntime(2220): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
04-06 13:48:05.419: E/AndroidRuntime(2220): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
04-06 13:48:05.419: E/AndroidRuntime(2220): at android.app.ActivityThread.access$600(ActivityThread.java:123)
04-06 13:48:05.419: E/AndroidRuntime(2220): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
04-06 13:48:05.419: E/AndroidRuntime(2220): at android.os.Handler.dispatchMessage(Handler.java:99)
04-06 13:48:05.419: E/AndroidRuntime(2220): at android.os.Looper.loop(Looper.java:137)
04-06 13:48:05.419: E/AndroidRuntime(2220): at android.app.ActivityThread.main(ActivityThread.java:4424)
04-06 13:48:05.419: E/AndroidRuntime(2220): at java.lang.reflect.Method.invokeNative(Native Method)
04-06 13:48:05.419: E/AndroidRuntime(2220): at java.lang.reflect.Method.invoke(Method.java:511)
04-06 13:48:05.419: E/AndroidRuntime(2220): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
04-06 13:48:05.419: E/AndroidRuntime(2220): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
04-06 13:48:05.419: E/AndroidRuntime(2220): at dalvik.system.NativeStart.main(Native Method)
04-06 13:48:05.419: E/AndroidRuntime(2220): Caused by: java.lang.NullPointerException
04-06 13:48:05.419: E/AndroidRuntime(2220): at android.view.ViewConfiguration.get(ViewConfiguration.java:331)
04-06 13:48:05.419: E/AndroidRuntime(2220): at android.view.View.(View.java:2698)
04-06 13:48:05.419: E/AndroidRuntime(2220): at android.view.View.(View.java:2744)
04-06 13:48:05.419: E/AndroidRuntime(2220): at android.view.ViewGroup.(ViewGroup.java:385)
04-06 13:48:05.419: E/AndroidRuntime(2220): at android.widget.RelativeLayout.(RelativeLayout.java:179)
04-06 13:48:05.419: E/AndroidRuntime(2220): at com.jeremyfeinstein.slidingmenu.lib.SlidingMenu.(SlidingMenu.java:203)
04-06 13:48:05.419: E/AndroidRuntime(2220): at com.jeremyfeinstein.slidingmenu.lib.SlidingMenu.(SlidingMenu.java:192)
04-06 13:48:05.419: E/AndroidRuntime(2220): at com.jeremyfeinstein.slidingmenu.lib.SlidingMenu.(SlidingMenu.java:171)
04-06 13:48:05.419: E/AndroidRuntime(2220): at com.negahetazehco.MothersDay.CustomizedSlidingMenu.(CustomizedSlidingMenu.java:12)
هنگام فراخوانی و ایجاد باید از دستور زیر استفاده کرد
CustomizedSlidingMenu menu = new CustomizedSlidingMenu(this);
public class G extends Application {
public static CustomizedSlidingMenu menu;
}
@Override @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.page2);
G.menu = new CustomizedSlidingMenu(G.CurrentActivity);
}
protected void onPause() {
super.onPause();
if (G.menu.isMenuShowing())
G.menu.toggle();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
G.adapter.notifyDataSetChanged();
G.menu = null;
Log.i(G.LOG_TAG, "Menu is = " + G.menu);
G.menu = new CustomizedSlidingMenu(this);
Log.i(G.LOG_TAG, "Menu is = " + G.menu);
}
اصلا به من بگین چحوری میشه از شر این خلاص شد یعنی اینکه وقتی میسازیمش من چک کردم حتی وقتی مساوی با null قرار میدم بازم اسلاید منو چسبیده به اکتیوییتی چجور میشه کلا یک کاستوم کنترل مث اینو از اکتیویتی فعلی پاک کرد ؟
سوتال من درکل دوتاست
۱- چکار کنم که وقتی برمیگردم دوباره به اکتیویتی بدون نوشتن خطی که دوباره اسلایدینک منو رو مقداردهی میکنه به کاستوم پنل های دیگه بفهمونم که بشناسنش و فرمانهایی که میدم مثل G.menu.toggle عمل کنه ... چون وقتی که برمیکردم روی اکتیویتی با درگ کردن روی صفحه هنوز اسلاید منو فعاله ولی متغیر G.menu رو تا صدا میزنم کاری نمیکنه دیکه ...
۲- چحور کلا یک کاستوم کنترل که اضافه کردیمو جک کنیم اکه وجود داره پاکش کن و دوباره بساز توی onresume
این کاری که گفته اید هربار مقدار بدیم اسلاید منو رو کار اشتباهیه چون افزونگی ایجاد میکنه و برنامه داره هربار یک شیع تکراری بهش اضافه میشه به ازای هر اکتیویتی که میاد روی صفحه ... حالا به من بگین چکار کنم برنامم هنگ میکنه بعد یک مدت
دوست عزیز که سوال پرسیدی. شما ابتدا باید یه تابع مادر معرفی کنی و مثلا اسمشو میگذاریم AcitivityEnhanced
بعد میایم اونو extends می کنیم از توابعی که قراره توش استفاده بشه. مثلا اگر توبعی که استفاده میکنن Activity باشن از اون و اگه ListActivity باشن از اون یا هرچیزی دیگه. تو پروژه خودم چون کلاس هام یا Activity بودن یا ListActvity . دوتا کلاس ActivityEnhanced تعریف کردم و عدد 1 و 2 گذاشتم براش و Extends کردمش از Activity یا ListActivity. که شد اینجوری:
public class ActivityEnhanced1 extends ListActivity {
//and
public class ActivityEnhanced2 extends Activity {
بعد میایم به اون کلاسهامون و extendes شون میکنیم از یکی از این توابع مادر تا ازش ارس بری کنن. مثلا من اینجوری کردم:
public class My_main extends ActivityEnhanced2 {
بعدش میایم توی یه کلاسG معروف تعریف میکنیم به شرح زیر:
public class G extends Application {
public static Context context;
public static Activity currentActivity;
@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext();
}
}
حالا میایم توی توابع مادر ActivityEnhanceds اول یه تابع onResume تعریف میکنیم:
@Override
public void onResume() {
super.onResume();
G.currentActivity = this;
}
بعد میایم حالا اون توابع sliding مون رو اینجا زیرش تعریف میکنیم و مقدارشم اول public مینویسم . مثلا من اینجوری نوشتم:
public void myfunc(){
}
حالا واسه اینکه توی توابعمون ممکنه بخوایم از آدرس کلاسی که توش هستیم استفاه کنیم دیگه نمیایم بنویسیم مثلا Main.this بلکه مینویسیم G.currentActivity که درواقع آدرس کلاسی که توش هست رو برای ما برمی گردونه. خب حالا برای آزمایش. ما یه کلاس main داریم که قرار اگه روی یه buttoni کلیک شد این بره به یه اکتیویتی دیگه. این تابع رو میایم اول توی ActivityEnhanced تعریف میکنیم که کلای میشه این:
public class ActivityEnhanced extends ListActivity {
@Override
public void onResume() {
super.onResume();
G.currentActivity = this;
}
public void myfunc(){
Button my_btn=(Button) di.findViewById(R.id.my_btn);
my_btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent i=new Intent(G.currentActivity,Other_page.class);
startActivity(i);
}
});
}
}
حالا تو اون کلاس Main میایم و اول extends میکنم از این کلاسه بعدشم دوتا G و تابع مورد نظرمون رو فراخونی میکنیم:
public class Main extends ActivityEnhanced2 {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
G.currentActivity = this;
myfunc();
}
}
همینو باز مشکلی بود در خدمتم
ببین sadra جان این تابعی که در زیر مینویسم ورودیش یک اکتیویتیه شما من کلا منظورتو فهمیدم میگی آقا فک کن اصلا اکتیویتی انهنس همون اکتیویتی چک استاده .. بیا یک تابع توش تعریف کن به اسم myfunc و کدهاتو توش بزار ازین به بعدچون اکتیویتی ها از اکتیویتی انهنس ارث بری میکنه پس دیکه نیاز به نوشتن چند باره این تابع نیست اما سوالم اینه شما پوست کنده به من بگو این تابع رو من چحوری توی تابع myfunc قرار بدم که مثل بچچه آدم کار کنه چون ورودیشو اینا فرق داره یکم تابعو باز مینویسم
publicclassCustomizedSlidingMenuextendsSlidingMenu{publicCustomizedSlidingMenu(finalActivityActivity){super(Activity);
View view = G.inflater.inflate(R.layout.sliding_menu,null);
this.setMode(SlidingMenu.LEFT);this.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);this.setBehindOffset(120);this.setFadeDegree(0.35f);this.attachToActivity(Activity,SlidingMenu.SLIDING_CONTENT);this.setMenu(view);}
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .