问题如下: 我想在一个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" 试试呢 | -----
各位大大,有什么方法能获取到屏幕切换的事件?请教高人指点,现在我每次切换屏幕方向后,所有的东西都不跑了。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 ======= -------
|
|
|
|