当前位置: 移动技术网 > 移动技术>移动开发>Android > 谈谈Android里的Context的使用实例

谈谈Android里的Context的使用实例

2019年07月24日  | 移动技术网移动技术  | 我要评论

大家好,今天给大家分享一下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---- 点击第二个按钮

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网