`
xiehongdong
  • 浏览: 68632 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

系统设置更改时间onConfigurationChanged

阅读更多

在前一个例子中我们看到了屏幕方向的更改,事实上,当屏幕方向改变是,就会发生onConfigurationChanged()事件;虽然可以在更改方向是显示要更改的方向,但是并无法取得更改后的宽高或更改后的结果,此时,就必须通过onConfigurationChanged()的心事事件进行处理。

onConfigurationChanged()方法是当系统发生系统设置改变之后所触发的事件,其中唯一的传入参数为Configuration对象,出来可以捕捉屏幕设置更改事件之外,也可扑捉其他系统设置更改事件,如隐藏键盘或打开键盘等。

public class EX05_23 extends Activity
{
  private TextView mTextView01;
  private Button mButton01;
  
  /* 屏幕宽高 */
  private int intScreenH,intScreenW;
  
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    
    /* 声明Display对象,以取得屏幕宽高 */
    final Display defaultDisplay = getWindow().getWindowManager().getDefaultDisplay();
    intScreenH= defaultDisplay.getHeight();
    intScreenW = defaultDisplay.getWidth();
    
    mButton01 = (Button)findViewById(R.id.myButton1); 
    mTextView01 = (TextView)findViewById(R.id.myTextView1);
    mTextView01.setText(Integer.toString(intScreenW)+"x"+Integer.toString(intScreenH));
    
    /* 当宽>高,表示为横式显示 */
    if(intScreenW > intScreenH)
    {
      /* Landscape */
      mButton01.setText(R.string.str_button2);
    }
    else
    {
      /* Portrait */
      mButton01.setText(R.string.str_button1);
    }
    
    /* 按钮事件处理切换宽高 */
    mButton01.setOnClickListener(new Button.OnClickListener()
    {
      @Override
      public void onClick(View v)
      {
        // TODO Auto-generated method stub
        intScreenH= defaultDisplay.getHeight();
        intScreenW = defaultDisplay.getWidth();
        
        /* 如果为Landscape */
        if(intScreenW > intScreenH)
        {
          /* Landscape => Portrait */
          setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
        else
        {
          /* Portrait => Landscape */
          setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }
        
        /* 再一次取得屏幕宽高 */
        intScreenH= defaultDisplay.getHeight();
        intScreenW = defaultDisplay.getWidth();
        mTextView01.setText(Integer.toString(intScreenW)+"x"+Integer.toString(intScreenH));
      }
    });
  }  
  
  @Override
  public void onConfigurationChanged(Configuration newConfig)
  {
    // TODO Auto-generated method stub
    
    /* 覆写onConfigurationChanged事件,捕捉当设定之后的值 */
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
    {
      /* 趁着事件发生之后,变更按钮上的文字 */
      mButton01.setText(R.string.str_button2);
      mMakeTextToast
      (
        getResources().getText(R.string.str_onConf_LANDSCAPE).toString(),
        false
      );
    }
    
    /* 须设定configChanges属性才能捕捉onConfigurationChanged */
    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT)
    {
      mButton01.setText(R.string.str_button1);
      mMakeTextToast
      (
        getResources().getText(R.string.str_onConf_PORTRAIT).toString(),
        false
      );
    }
    
    if (newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_NO)
    {
     
    }
    super.onConfigurationChanged(newConfig);
  }
  
  public void mMakeTextToast(String str, boolean isLong)
  {
    if(isLong==true)
    {
      Toast.makeText(EX05_23.this, str, Toast.LENGTH_LONG).show();
    }
    else
    {
      Toast.makeText(EX05_23.this, str, Toast.LENGTH_SHORT).show();
    }
  }
}

 必须要在Activity里设置configChanges属性,以作为系统设置更改时要扑捉的事件,除此之外,还需要获得系统设置更改的权限(<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"></uses-permission>)

<application
    android:icon="@drawable/icon"
    android:label="@string/app_name">
    <!-- 必須設定activity的configChanges屬性 -->
    <activity
      android:name=".EX05_23"
      android:label="@string/app_name"
      android:configChanges="orientation|keyboard">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
  </application>
  <uses-sdk android:minSdkVersion="8" />
  <!-- 必須設定CHANGE CONFIGURATION權限 -->
  <uses-permission android:name="android.permission.CHANGE_CONFIGURATION"></uses-permission>

 

分享到:
评论

相关推荐

    疯狂安卓讲义第2章

    首先,我们从“疯狂安卓讲义”这个系列可以推测,它是一套系统性、深入浅出的教程,以"疯狂"命名,可能强调的是深入和实战性,旨在让学习者在短时间内对Android开发有全面且深入的理解。第2章通常会建立在第一章的...

    Android应用源码之(横竖屏切换处理).zip

    - **忽略配置变更**:在AndroidManifest.xml中针对特定Activity设置`android:configChanges="orientation|screenSize"`,不让系统自动处理,然后在Activity中重写`onConfigurationChanged(Configuration newConfig)...

    java面试题1.pdf

    当这些配置更改发生时,系统会调用Activity的onConfigurationChanged()方法。 3. Activity间的状态保存:在文档中,提到了Activity的生命周期中的状态保存。在Activity可能被系统销毁时,比如配置更改或者系统资源...

    日期选择控件(可防止屏幕旋转抛出的异常)

    这样,系统在屏幕旋转时不会默认销毁Activity,而是调用`onConfigurationChanged(Configuration newConfig)`方法。但这种方法并不推荐,因为它会使Activity负责处理屏幕旋转的逻辑,而使用ViewModel的方式更符合...

    Android面试题

    - **Android是否属于RTOS**:尽管Android具有一定的实时性,但它不是严格意义上的实时操作系统,因为它主要面向的是移动设备的应用环境,而不是要求严格时间响应的工业控制等领域。 综上所述,理解上述知识点对于...

    Android中英俄切换

    此外,考虑到Android系统可能需要一段时间才能完全更新语言设置,我们可能需要监听`onConfigurationChanged()`回调,以便在语言切换后及时刷新界面。 总之,实现"Android中英俄切换"涉及了Android的资源管理、配置...

    android重力感应禁止调用oncreat方法

    3. **性能考虑**:频繁地调用`onCreate()`确实会增加应用的启动时间,尤其是在资源密集型的操作中。通过适当的方式避免不必要的重启可以提高应用的整体性能。 4. **测试**:在实际部署之前,务必在多种设备和屏幕...

    android 事件处理

    开发者可以通过重写Activity的onConfigurationChanged方法来处理配置更改事件,或者注册BroadcastReceiver来监听系统广播,如网络连接状态的改变。 4. **Handler消息传递机制**:Handler是Android中用于线程间通信...

    安卓app开发项目-仿360 浮动小插件效果(源码).zip

    服务是安卓系统中一个在后台运行的组件,它可以长时间执行任务而不显示用户界面。在这个项目中,服务可能用于维持浮动小插件的存在状态,即使用户切换到其他应用,小插件依然能在屏幕上方显示。 窗口管理器则允许...

    五大布局与4大组件

    - onConfigurationChanged():配置更改时(如屏幕方向变化)调用,除非在AndroidManifest.xml中声明对应的配置变化。 在处理屏幕旋转时,Android会默认重新创建Activity以适应新的配置。通过设置`android:...

    Android 国际化 一键切换语言

    这通常涉及到修改`Configuration`对象的`locale`属性,并调用`Resources.updateConfiguration()`方法。以下是一个简单的示例: ```java public void changeLanguage(String languageCode) { Locale locale = new...

    Google Android SDK开发范例大全(PDF高清完整版3)(4-3)

    5.23 系统设置更改事件——onConfigurationChanged信息处理 5.24 取得电信网络与手机相关信息——TelephonyManager与android.provider.Settings.System的应用 第6章 手机自动服务纪实 6.1 您有一条短信popup提醒...

    Google Android SDK开发范例大全(PDF完整版4)(4-4)

    5.23 系统设置更改事件——onConfigurationChanged信息处理 5.24 取得电信网络与手机相关信息——TelephonyManager与android.provider.Settings.System的应用 第6章 手机自动服务纪实 6.1 您有一条短信popup提醒...

    Google Android SDK开发范例大全(PDF高清完整版1)(4-1)

    5.23 系统设置更改事件——onConfigurationChanged信息处理 5.24 取得电信网络与手机相关信息——TelephonyManager与android.provider.Settings.System的应用 第6章 手机自动服务纪实 6.1 您有一条短信popup提醒...

    Google Android SDK开发范例大全(完整版)

    5.23 系统设置更改事件——onConfigurationChanged信息处理 5.24 取得电信网络与手机相关信息——TelephonyManager与android.provider.Settings.System的应用 第6章 手机自动服务纪实 6.1 您有一条短信popup提醒...

    暗黑模式?安卓适配一波

    IOS13推出到现在已经大半年了,系统应用没得说,完美适配,三方应用也都陆续支持了暗黑模式,就连微信在前段时间的更新中也实现了暗黑模式,先来欣赏下微信的暗黑模式吧! 当Activity声明它处理配置更改时,...

    Android(2.2/2.3系统)Gallery解决默认和横竖屏切换选中状态问题

    - **2.1** 当设备配置(如横竖屏切换)发生变化时,重写`onConfigurationChanged()`方法,调用`notifyDataSetChanged()`通知Gallery的Adapter数据已更新。 - **2.2** 在Gallery的`onItemSelected()`回调中,同样...

    037集-Activity纵横屏切换的数据保存与恢复

    这样,当屏幕旋转时,系统不会销毁并重新创建Activity,而是调用`onConfigurationChanged(Configuration newConfig)`方法。在这里,你需要手动处理配置变更,如更新UI布局以适应新的屏幕方向。 此外,还有一些最佳...

    Google Android SDK开发范例大全的目录

    5.23 系统设置更改事件——onConfigurationChanged信息处理 5.24 取得电信网络与手机相关信息——TelephonyManager与android.provider.Settings.System的应用 第6章 手机自动服务纪实 –p254 6.1 您有一条短信popup...

Global site tag (gtag.js) - Google Analytics