【Android】11.3 屏幕旋转和场景变换过程中GridView的呈现

分类:C#、Android、VS2015;

创建日期:2016-02-21

一、简介

实际上,对于布局文件中的View来说,大多数情况下,Android都会自动保存这些状态,并不需要我们都去处理它。这一节仍以GridView为例(第10章已经介绍过其基本用法了),说明屏幕旋转以及场景切换过程中用GridView呈现的图像是如何自动变换的。

本节主要关注下面的问题:

(1)如何通过GridView显示多幅图像。

(2)如何使用Activity从一个活动切换到另一个活动,即利用Activity实现场景转换的功能,将GridView网格图像的Acivity过渡到大图像的Activity。

(3)当用户触摸或单击GridView中的每幅图片时,如何立即切换到该图片对应的详细信息描述页;当用户单击屏幕下方左侧的那个【Back】按钮时,又返回到用GridView显示多幅图像的页面。

二、示例—ch1103GridViewSceneTransition

1、运行截图

下面左图为在GridView显示两列图像的效果,右图为单击【3、穿衣的小狗】后显示的效果。按右图下方左侧的【Back】按钮又返回到左图的界面,可再次单击另一幅图。

 

本人不想再去找其他的图片了,所以仍然用前面章节示例中的图来演示。当然,你也可以将例子中这个两列的图改为3列、4列、……,同时将界面改为任何你希望实现的功能。

2、实现步骤

(1)添加ch1103_GridViewSceneTransitionMain.axml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">
    <GridView
        android:id="@+id/gridview1"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center_horizontal"
        android:horizontalSpacing="2dp"
        android:numColumns="2"
        android:stretchMode="columnWidth"
        android:verticalSpacing="2dp"
        android:layout_gravity="center"
        android:minWidth="25dp"
        android:minHeight="25dp"
        android:drawSelectorOnTop="true"
        android:layout_marginLeft="50dp"
        android:layout_marginRight="50dp"
        android:layout_marginTop="20dp"
        android:layout_marginBottom="20dp" />
</LinearLayout>

(2)添加ch1103_Item.axml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:outlineProvider="bounds">
    <ImageView
        android:id="@+id/ch1102ImageViewItem"
        android:layout_width="90dp"
        android:layout_height="90dp"
        android:scaleType="centerCrop"
        android:minHeight="25dp"
        android:minWidth="25dp"
        android:layout_gravity="center_horizontal" />
    <TextView
        android:id="@+id/ch1102TextViewItemTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:maxLines="1"
        android:layout_gravity="center_horizontal"
        android:minWidth="25dp"
        android:textSize="10dp" />
</LinearLayout>

(3)添加ch1103_Detail.axml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:id="@+id/ch1102ImageView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scaleType="centerCrop"
        android:layout_marginTop="20dp" />
    <TextView
        android:id="@+id/ch1102TextViewTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:maxLines="1"
        android:layout_gravity="center_horizontal"
        android:textColor="#FF0000" />
    <TextView
        android:id="@+id/ch1102TextViewDesc"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:padding="16dp" />
</LinearLayout>

(4)添加ch1103GridViewSceneTransitionMain.cs文件

using System.Collections.Generic;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Views;
using Android.Widget;

namespace MyDemos.SrcDemos
{
    [Activity(Label = "【例11-3】场景转换")]
    public class ch1103GridViewSceneTransitionMain : Activity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.ch1103_GridViewSceneTransitionMain);
            var gridview = FindViewById<GridView>(Resource.Id.gridview1);
            var adapter = new ch1102MyImageAdapte(this);
            gridview.Adapter = adapter;
            gridview.ItemClick += (s, e) =>
            {
                var item = adapter[e.Position];
                Intent intent = new Intent(this, typeof(ch1103DetailActivity));
                intent.PutExtra("id", item.ImageId);
                intent.PutExtra("title", item.Title);
                intent.PutExtra("desc", item.Desc);
                StartActivity(intent);
            };
        }
    }

    /// <summary>
    /// 这里仅以小狗图为例说明基本用法,这样做主要是为了不让例子过于复杂,
    /// 实际上,你可以将小狗图改为景点图、大楼图、交通图、功能模块图、……等。
    /// </summary>
    class ch1103Item
    {
        /// <summary>
        /// 图片ID
        /// </summary>
        public int ImageId { get; set; }
        /// <summary>
        /// 图片的标题
        /// </summary>
        public string Title { get; set; }
        /// <summary>
        /// 对该图片的描述
        /// </summary>
        public string Desc { get; set; }
    }
    class ch1102MyImageAdapte : BaseAdapter<ch1103Item>
    {
        Activity context;

        public ch1102MyImageAdapte(Activity context)
        {
            this.context = context;
        }

        private static List<ch1103Item> items = new List<ch1103Item>()
        {
            new ch1103Item {ImageId=Resource.Drawable.ch05sample_0,
                Title="1、迷茫的小狗", Desc ="哇,迷路了,该往哪走呢?" },
            new ch1103Item {ImageId=Resource.Drawable.ch05sample_1,
                Title="2、耍赖的小狗", Desc ="你就是躺到那也不让你吃。" },
            new ch1103Item {ImageId=Resource.Drawable.ch05sample_2,
                Title="3、穿衣的小狗", Desc ="过年了,给小狗穿个花衣服。" },
            new ch1103Item {ImageId=Resource.Drawable.ch05sample_3,
                Title="4、小狗和女友", Desc ="狗狗,后面是你女朋友吗?" },
            new ch1103Item {ImageId=Resource.Drawable.ch05sample_4,
                Title="5、悲催的小狗", Desc ="这个图片很悲催。" },
            new ch1103Item {ImageId=Resource.Drawable.ch05sample_5,
                Title="6、看门的小狗", Desc ="好好看门,别让贼进来了。" },
            new ch1103Item {ImageId=Resource.Drawable.ch05sample_6,
                Title="7、卖萌的小狗", Desc ="狗狗的沙发很给力啊。" },
            new ch1103Item {ImageId=Resource.Drawable.ch05sample_7,
                Title="8、愤怒的小狗", Desc ="谁惹你了,眼瞪这么大。" },
        };

        public override ch1103Item this[int position]
        {
            get { return items[position]; }
        }

        public override int Count
        {
            get { return items.Count; }
        }

        public override long GetItemId(int position)
        {
            return items[position].ImageId;
        }

        public override View GetView(int position, View convertView, ViewGroup parent)
        {
            if (convertView == null)
            {
                convertView = context.LayoutInflater.Inflate(Resource.Layout.ch1103_Item, parent, false);
            }
            ch1103Item item = this[position];
            ImageView imageView = convertView.FindViewById<ImageView>(Resource.Id.ch1102ImageViewItem);
            imageView.SetImageResource(item.ImageId);
            TextView title = convertView.FindViewById<TextView>(Resource.Id.ch1102TextViewItemTitle);
            title.Text = item.Title;
            return convertView;
        }
    }
}

(5)添加ch1103DetailActivity.cs文件

using Android.App;
using Android.Content;
using Android.OS;
using Android.Widget;

namespace MyDemos.SrcDemos
{
    [Activity(Label = "【例11-3】场景转换")]
    public class ch1103DetailActivity : Activity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.ch1103_Detail);
            int imgId = Intent.GetIntExtra("id", -1);
            if (imgId != -1)
            {
                var imageView = FindViewById<ImageView>(Resource.Id.ch1102ImageView1);
                imageView.SetImageResource(imgId);
                var title = FindViewById<TextView>(Resource.Id.ch1102TextViewTitle);
                title.Text = Intent.GetStringExtra("title");
                var desc = FindViewById<TextView>(Resource.Id.ch1102TextViewDesc);
                desc.Text = Intent.GetStringExtra("desc");
            }
        }
    }
}
时间: 2024-08-28 00:02:49

【Android】11.3 屏幕旋转和场景变换过程中GridView的呈现的相关文章

Qt for Android 程序禁止屏幕旋转

有时候我们希望让一个程序的界面始终保持在一个方向,不随手机(平板)方向旋转而变化:在AndroidManifest.xml的每一个需要禁止转向的Activity配置中加入 android:screenOrientation=”landscape” 属性. landscape = 横向 portrait = 纵向 原创文章,转载请注明: 转载自 http://www.mr-wu.cn/ 吴川斌的博客 本文链接地址: Qt for Android 程序禁止屏幕旋转 http://www.mr-wu.

app在android 6.0或以上平台版本运行过程中请求权限

原文作者:Google 原文地址:http://developer.android.com/intl/zh-cn/training/permissions/requesting.html 原文版权:Creative Commons 2.5 Attribution License 译文作者:Jianan - [email protected] 版本信息:本文基于2016-04-27版本翻译 译文版权:CC BY-NC-ND 4.0,允许复制转载,但必须保留译文作者署名及译文链接,不得演绎和用于商业

Loadrunner脚本回放 场景运行过程中常见错误分析

问题一:Loadrunner超时错误问题描述 Loadrunner超时错误:在录制Web协议脚本回放时超时情况经常出现,产生错误的原因也有很多,解决的方法也不同. 问题现象Error -27728: Step download timeout (120 seconds) has expired when downloading non-resource(s). 错误分析对于HTTP协议,默认的超时时间是120秒(可以在LoadRunner中修改),客户端发送一个请求到服务器端,如果超过120秒服

【分享】迅为iTOP4412开发板-Android系统屏幕旋转设置

1.1概述 Android4.0,Androd4.4源代码能够编译成手机模式和平板模式,讯为iTop4412 开发平台 的Android系统默认编译为平板模式.客户须要依据自己的产品设计及应用环境,切换屏幕 的显示方向,或者固定好一个显示方向,比如产品中使用不同分辨率的显示屏,或者显示屏 在产品中的固定方向发生改变等等,都须要进行屏幕旋转功能.  那么怎样设置屏幕的旋转 呢?我们提供两种方式满足客户的这一需求. 1.2  安装屏幕旋转APK 迅为公司公布的  Android4.4镜像中含有  S

Android开发--教你巧妙应对屏幕旋转

Android手机支持屏幕旋转功能,手机屏幕旋转直接引发了我们的App视图变化,我们选择怎样去处理手机的翻转以及当我们的手机屏幕发生了旋转的时候我们选择何种策略去进行处理视图直接影响了我们的App的用户体验.今天我们一起来学习一下手机屏幕旋转的相关知识. 设置屏幕方向切换的属性 为了使Activity在屏幕旋转方向适应不同的场合,在AndroidManifest文件的activity标签下提供了android:screenOrientation属性用于满足不同的屏幕旋转需求. unspecifi

Android Studio使用过程中常见问题及解决方案

熟悉Android的童鞋应该对Android Studio都不陌生.Android编程有两个常用的开发环境,分别是Android Studio和Eclipse,之前使用比较多的是Eclipse,而现在呢,由于Android Studio的优越性,越来越多的人转而使用它了. 随着Android Studio使用人数的增加,使用过程中的问题也日益凸显,本文小编就整理了一些Windows系统下使用Android Studio的常见问题及解决方案,大家可以围观围观,遇到类似问题,不妨可以试试小编下面分享

Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案

出处:http://blog.csdn.net/lmj623565791/article/details/37936275 1.概述 众所周知,Activity在不明确指定屏幕方向和configChanges时,当用户旋转屏幕会重新启动.当然了,应对这种情况,Android给出了几种方案: a.如果是少量数据,可以通过onSaveInstanceState()和onRestoreInstanceState()进行保存与恢复. Android会在销毁你的Activity之前调用onSaveInst

Android 设定横屏,禁止屏幕旋转,Activity重置 [更新视频播放器相关]

1. 设定屏幕方向 当指定了屏幕的方向后(非SCREEN_ORIENTATION_UNSPECIFIED),屏幕就不会自己主动的旋转了 有2中方式控制屏幕方向: 1.1 改动AndroidManifest.xml 在AndroidManifest.xml的activity中增加: 横屏: android:screenOrientation="landscape" 竖屏: android:screenOrientation="portrait" 1.2 setRequ

android 屏幕旋转

转自:http://blog.csdn.net/oyzhizhong/article/details/8131799 屏是LANDSCAPE的,要让它默认显示为PORTRAIT. 1.kernel里要旋转FrameBuffer.  启动参数里加入fbcon=rotate:1    (0:正常屏; 1:顺时钟转90度; 2:转180度; 3:顺时钟转270度;)最后生成的autoconf.h里有类似项:#define CONFIG_CMDLINE "console=ttySAC0,115200 f