谈谈Android里的Context的使用实例
大家好,今天给大家分享一下android里的context的一些用法,以前经常有人在群里问我比如我在一个工具类里的某个方法,或者view里需要调用context.但是工具类还有view里没有这个上下文怎么办?为了解决大家的疑问,为了解决大家的疑问,我今天写一个简单的demo.让大家如何学好自如的用context.想什么时候有context,什么时候就有context.
这里大致可以分为两种:一是传递context参数,二是调用全局的context.
其实我们应用启动的时候会启动application这个类,这个类是在androidmanifest.xml文件里其实是默认的
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name="applicationdemoactivity" android:label="@string/app_name" > <intent-filter> <action android:name="androidintentactionmain" /> <category android:name="androidintentcategorylauncher" /> </intent-filter> </activity> </application>
这个application类是单例的,也就是说我们可以自己写个application(比如名为:mainapplication)类,来代替默认的applicaiton,这个类可以保存应用的全局变量,我们可以定义一个全局的context.供外部调用.用法如下:
package com.tutor.application; import androidappapplication; import androidcontentcontext; public class mainapplication extends application { /** * 全局的上下文 */ private static context mcontext; @override public void oncreate() { superoncreate(); mcontext = getapplicationcontext(); } /**获取context * @return */ public static context getcontext(){ return mcontext; } @override public void onlowmemory() { superonlowmemory(); } }
我们需要在androidmainifest.xml把mainapplication注册进去(第10行代码):
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemasandroidcom/apk/res/android" package="comtutorapplication" android:versioncode="1" android:versionname="0" > <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:name="mainapplication" > <activity android:name="applicationdemoactivity" android:label="@string/app_name" > <intent-filter> <action android:name="androidintentactionmain" /> <category android:name="androidintentcategorylauncher" /> </intent-filter> </activity> </application> </manifest>
为了让大家更容易理解,写了一个简单的demo.步骤如下:
第一步:新建一个android工程applicationdemo,目录结构如下:
第二步:新建mainapplication.java,代码和上面一样我就不贴了.
第三步:新建一个工具类toolsutil.java,代码如下
package com.tutor.application; import androidcontentcontext; import androidwidgettoast; /** * @author frankiewei * 应用的一些工具类 */ public class toolutils { /** * 参数带context * @param context * @param msg */ public static void showtoast(context context,string msg){ toastmaketext(context, msg, toastlength_short)show(); } /** * 调用全局的context * @param msg */ public static void showtoast(string msg){ toastmaketext(mainapplicationgetcontext(), msg, toastlength_short)show(); } }
第四步:新建一个view命名为mainview.java就是我们activity现实的view.代码如下:
package com.tutor.application; import androidappactivity; import androidcontentcontext; import androidutilattributeset; import androidviewlayoutinflater; import androidviewview; import androidwidgetbutton; import androidwidgetframelayout; /** * @author frankiewei * 自定义的mainview */ public class mainview extends framelayout implements viewonclicklistener{ private context mcontext; private activity mactivity; /** * 参数button */ private button margbutton; /** * 全局button */ private button mgloblebutton; /** * 退出button */ private button mexitbutton; public mainview(context context){ super(context); setupviews(); } public mainview(context context, attributeset attrs) { super(context, attrs); setupviews(); } private void setupviews(){ //获取view的上下文 mcontext = getcontext(); //这里将context转换为activity mactivity = (activity)mcontext; layoutinflater inflater = layoutinflaterfrom(mcontext); view v = inflaterinflate(rlayoutmain, null); addview(v); margbutton = (button)vfindviewbyid(ridarg_button); mgloblebutton = (button)vfindviewbyid(ridglo_button); mexitbutton = (button)vfindviewbyid(ridexit_button); margbuttonsetonclicklistener(this); mgloblebuttonsetonclicklistener(this); mexitbuttonsetonclicklistener(this); } public void onclick(view v) { if(v == margbutton){ toolutilsshowtoast(mcontext, "我是通过传递context参数显示的!"); }else if(v == mgloblebutton){ toolutilsshowtoast("我是通过全局context显示的!"); }else{ mactivityfinish(); } } }
这里mainview.java使用的布局main.xml代码如下:
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemasandroidcom/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <textview android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="welcome to frankie wei's blog" /> <button android:id="@+id/arg_button" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="传递context参数" /> <button android:id="@+id/glo_button" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="全局的context" /> <button android:id="@+id/exit_button" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="退出app" /> </linearlayout>
第五步:修改applicationdemoactivity.java,代码如下:
package com.tutor.application; import androidappactivity; import androidosbundle; public class applicationdemoactivity extends activity { @override public void oncreate(bundle savedinstancestate) { superoncreate(savedinstancestate); mainview mmainview = new mainview(this); setcontentview(mmainview); } }
第六步:运行上述工程效果如下:
运行效果1
运行效果2---- 点击第一个按钮
运行效果3---- 点击第二个按钮
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
谈谈Android里的Context的使用实例
-
实例讲解Android App使用自带的SQLite数据库的基本方法
-
Android GZip的使用-开发中网络请求的压缩实例详解
-
Android中使用DialogFragment编写对话框的实例教程
-
Android App中使用ListFragment的实例教程
-
Android App中使用LinearLayout进行居中布局的实例讲解
-
Android开发中使用Volley库发送HTTP请求的实例教程
-
实例讲解Android中的AIDL内部进程通信接口使用
-
详解Android首选项框架的使用实例
-
Android App中使用SurfaceView制作多线程动画的实例讲解