横竖屏切换

来源:互联网 发布:mac误删除文件恢复 编辑:程序博客网 时间:2024/04/28 03:35

问题如下:

关于android图片widget横竖屏切换时的问题 

我想在一个Activity里面放一张很大的图片,点击后进入另外一个Activity,在不切换横竖屏时一切正常,在横竖屏切换的时候程序就很容易报异常,强行关闭。查看LOG显示Unable to start activity Componentinfo 以及XML文件内容错误。不知道什么原因,请教高人指点。
图片大小804K
分辨率1754×2480
是图片太大的缘故吗?有什么办法可以解决?

xml文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content" android:layout_height="wrap_content">
<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content" android:layout_height="wrap_content">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content">
  <ImageView android:id="@+id/ImageView01" android:src="@drawable/originalimg"
   android:layout_width="wrap_content" android:layout_height="wrap_content"/>   
</LinearLayout>
</HorizontalScrollView>
</ScrollView>
activity 定义如下:
package com.escarpbc.demo;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
public class ActivityMain extends Activity {
/** Called when the activity is first created. */
private static final int SHOW_PARAGRAPH = 0;
private ImageView imgv;
private OnClickListener listener1;
@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  listener1 = new OnClickListener() {
   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    Intent intent1 = new Intent(ActivityMain.this, ListTest.class);
    startActivityForResult(intent1, SHOW_PARAGRAPH);
   }
  };
  imgv = (ImageView) findViewById(R.id.ImageView01);
  imgv.setOnClickListener(listener1);
}
@Override
protected void onActivityResult(int requestCode, int resultCode,
   Intent intent) {
  super.onActivityResult(requestCode, resultCode, intent);
}
}


为activity加上标签:
android:configChanges = "orientation|keyboardHidden" 
试试呢-----

widget中自动横竖屏切换时的问题

各位大大,有什么方法能获取到屏幕切换的事件?请教高人指点,现在我每次切换屏幕方向后,所有的东西都不跑了。onUpdate也不跑了。。真没办法了。。--

这个问题解决了,虽然不知道造成问题的具体原因,不过总算解决了。
问题是因为在onReceive (Context context, Intent intent)函数中,用
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.main);
   AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
   ComponentName thisWidget = new ComponentName(context,Act_Lastfm.class);
   appWidgetManager.updateAppWidget(thisWidget, views);
刷新了屏幕,导致widget丢失掉,所以就把所有的刷新动作都放到onUpdate()函数最后去做,onReceive()函数中接受到广播后的所有的操作,都存放到数据库中去,然后发送UPDATE的广播给自己。widget就会自动调用onUpdate()函数,进行刷新。这样就没问题了。



还是刷新屏幕的老问题,又出现了。。我的widget有4个TextView,现在想做的效果是我选中的TextView会变红。

首先设置了对第一个TextView的监听:

mIntent_Click_Row1  = new Intent("nicdy.widget.layouta.CLICK_ROW1");
mPIntent_Click_Row1 = PendingIntent.getBroadcast(context, 0, mIntent_Click_Row1, 0);
views.setOnClickPendingIntent(R.id.row1, mPIntent_Click_Row1);


public void onReceive (Context context, Intent intent) {
                super.onReceive(context, intent);
                String action = intent.getAction();
if (action.equals("nicdy.widget.layouta.CLICK_ROW1")) {
        //设置当前选中的行ID为0,存入数据库
        BaseData mBaseData = new BaseData( context, "Main.db", 1 );
        mBaseData.UpdateWidgetState("0");                        
        mBaseData.CloseDB();
        //发送UPDATE广播
        Intent mIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
        context.sendBroadcast(g_mIntent);
}else if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action)) {

         Bundle extras = intent.getExtras();
                if (extras != null) {
                    int[] appWidgetIds = extras.getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS);
                    if (appWidgetIds != null && appWidgetIds.length > 0) {
                            g_mIntent = intent;
                        this.onUpdate(context, AppWidgetManager.getInstance(context), appWidgetIds);
                        
                    }
                }
}
每次按下第一行,进到AppWidgetManager.ACTION_APPWIDGET_UPDATE里的时候extras 总是为null,这个怎么解决呢?

正确。哈哈,最后是看了music的widget的源码,发现原来它用了2个刷新,如果id存在就用updateAppWidget(int[] appWidgetIds, RemoteViews views) 刷新,如果ID不存在就用的updateAppWidget(ComponentName provider, RemoteViews views)  ,跟着它的写法。在onUpdate函数中检测int[] appWidgetids,如果为NULL,就用第2个函数刷新就OK了。。。.这个函数Set the RemoteViews to use for all AppWidget instances for the supplied AppWidget provider。问题暂时得到解决。。


----------

我是在修改launcher的时候出现的这个问题: launcher下面有两个配置文件夹一个是layout_land下面有个launcher.xml ,第二个是layout_port 下面也有个launcher.xml 但是我做横竖屏的时候横屏是获取的是layout_land下面的那个launcher.xml  当变成竖屏的时候还是获取的是launcher.xml   请问一下各位高手这是怎么回事, 有没有什么办法分别获取两个xml  (横屏的时候获取layout_land下面的launcher.xml , 竖屏的时候获取 layout_port下面的launcher.xml)

横竖屏的文件夹是layout-land、layout-port
以下来自网络

android中每次屏幕的切换动会重启Activity,所以应该在Activity销毁前保存当前活动的状态,在Activity再次Create的时候载入配置,那样,进行中的游戏就不会自动重启了!
当屏幕变为横屏的时候,系统会重新呼叫当前Activity的OnCreate方法,你可以把以下方法放在你的OnCreate中来检查当前的方向,然后可以让你的SetContentView来载入不同的Layout xml.

if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {

Log.i("info", "landscape");

}

else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {

Log.i("info", "portrait");

}

关于屏幕切换的时候
首先需要在androidmanifest.xml中加入配置
android:configChanges="orientation|keyboardHidden|navigation
这样在程序中. Activity就不会重复的调用onCreate()
甚至不会调用onPause.onResume.
只会调用一个onConfigurationChanged(Configuration newConfig)
这是在XML加入配置选项的前提下.

如果在就加入选项的前提下.如上所说. Activity会重新激活onCreate方法

----

       在浏览320*480(和屏幕大小一致)的图片时,第一次的竖转横时,出现图片没变化的情况,但第二次后就正常了。其他分辨率的没出现上叙情况。看了几天的代码只跟到onLayout在转换时在调用,但没有发现320*480的图片发什么会出现这中情况。请问大家有想法没?有知道横竖切换时,android框架中实现这一动作的过程是怎样的?

        3Q!

回答:;

可以在androidMainfest.xml里面配置android:screenOrientation来设置屏幕显示方式
也可以通过定义android:configChanges="orientation|keyboardHidden|navigation"
覆写onConfigurationChanged方法来定义屏幕切换时的动作
--
//      根据当前的画面,若为竖排则更改为横排
///*                
//        if(getRequestedOrientation()==ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
//        {
//                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
//        }
如果有大量的图片需要绘制时建议不使用!
--
默认情况下(竖屏)是调用res/layout 中的布局,如果要自定义横屏时的布局,可以在res/目录下新建一个layout-land 文件,在这个文件夹中放置横屏的布局,横竖屏的XML 文件的名字必须一样。=====layout-port和layout-land

-----
在activity中做判断,代码如下:
Configuration newConfig = getResources().getConfiguration();" w/ j4 `: ]5 S0 ~) \/ D+ |
   if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
//横屏时
setContentView(R.id.landscape);
}else if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
//竖屏时
setContentView(R.id.portrait);( o) y' l/ e3 \& \2 u
}6 e( c8 
=======
-------