Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 449|回复: 0

开发交流:新浪微博客户端信息页面布局的一些想法

[复制链接]

该用户从未签到

发表于 2011-10-24 10:02:05 | 显示全部楼层 |阅读模式
           
      大家看上面的图片,是新浪微博客户端中点击信息后显示的页面,每点击一个按钮后,就会变成新的视图,我经过询问和自己思考,想到三种办法:
在信息页面,三种解决办法:
第一种:每个layout 的XML文件最上面都加上你那几个按钮就行了。在每一个XML文件都加上我的那个标题头。那么就是说,要用三个布局文件,每当点击按钮后,就变换布局。
第二种:想想还有没有其他的办法。这好像并不是最好的办法。能不能在一个xmL文件中就实现。
      多隐藏几个视图。能,用framelayout把你要显示的包起来,然后再点击不同的按钮的时候用setVisible切换
      
第三种:使用ViewStub,专门用来解决第二种办法的方法。但是大家看后面的关于ViewStub的介绍,我三个按钮肯定是不断循环点击的,所以这种办法被否定了,它只能初始化一次,不能被多次反复调用。大家看下面的介绍就懂了。最后,我会给一个示例DEMO。
在开发应用程序的时候,经学会遇到这样的情况,会在运行时动态根据条件来决定显示哪个View或某个布局。那么最通常的想法就是把可能用到的View都写在上面,先把它们的可见性都设为View.GONE,然后在代码中动态的更改它的可见性。这样的做法的优点是逻辑简单而且控制起来比较灵活。但是它的缺点就是,耗费资源。虽然把View的初始可见View.GONE但是在Inflate布局的时候View仍然会被Inflate,也就是说仍然会创建对象,会被实例化,会被设置属性。也就是说,会耗费内存等资源。
      推荐的做法是使用android.view.ViewStub,ViewStub是一个轻量级的View,它一个看不见的,不占布局位置,占用资源非常小的控件。可以为ViewStub指定一个布局,在Inflate布局的时候,只有ViewStub会被初始化,然后当ViewStub被设置为可见的时候,或是调用了ViewStub.inflate()的时候,ViewStub所向的布局就会被Inflate和实例化,然后ViewStub的布局属性都会传给它所指向的布局。这样,就可以使用ViewStub来方便的在运行时,要还是不要显示某个布局。
      但ViewStub也不是万能的,下面总结下ViewStub能做的事儿和什么时候该用ViewStub,什么时候该用可见性的控制。
     首先来说说ViewStub的一些特点:
         1. ViewStub只能Inflate一次,之后ViewStub对象会被置为空。按句话说,某个被ViewStub指定的布局被Inflate后,就不会够再通过ViewStub来控制它了。
         2. ViewStub只能用来Inflate一个布局文件,而不是某个具体的View,当然也可以把View写在某个布局文件中。
     基于以上的特点,那么可以考虑使用ViewStub的情况有:
         1. 在程序的运行期间,某个布局在Inflate后,就不会有变化,除非重新启动。
              因为ViewStub只能Inflate一次,之后会被置空,所以无法指望后面接着使用ViewStub来控制布局。所以当需要在运行时不止一次的显示和隐藏某个布局,那么ViewStub是做不到的。这时就只能使用View的可见性来控制了。
         2. 想要控制显示与隐藏的是一个布局文件,而非某个View。
              因为设置给ViewStub的只能是某个布局文件的Id,所以无法让它来控制某个View。
     所以,如果想要控制某个View(如Button或TextView)的显示与隐藏,或者想要在运行时不断的显示与隐藏某个布局或View,只能使用View的可见性来控制。
1. 概述:
    ViewStub组件和<include>标签的作用类似,主要是为了提高布局的重用性,及布局的模块化。它们之间最大的差别是,ViewStub中的布局不会随着它所在布局的渲染而渲染,而<include>标签中的布局会随着它所在布局的渲染而渲染,ViewStub中的布局只有在你需要的时候才会渲染到主界面中。
2. 效果图:
   (1)在ButtonOne与ButtonTwo之间存在一个ViewStub布局,如下图:
     
(2)单击ButtonOne后渲染ViewStub中的布局,如下图:
     
3. 实现代码:
(1)res/layout/main.xml实现:
   
<?xml version="1.0" encoding="utf-8"?>



<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"

androidrientation = "vertical"

android:layout_width = "fill_parent"

android:layout_height = "fill_parent"

>



<Button

android:id = "@+id/show"

android:text = "ButtonOne"

android:layout_width = "wrap_content"

android:layout_height = "wrap_content"

/>



<ViewStub

android:id = "@+id/viewStub"

android:layout = "@layout/green_layout"

android:layout_width = "300dip"

android:layout_height = "300dip"

/>



<Button

android:layout_width = "wrap_content"

android:layout_height = "wrap_content"

android:text = "ButtonTwo"

/>



</LinearLayout>
复制代码


(2)main.xml中ViewStub组件里的布局实现:
  
<?xml version="1.0" encoding="utf-8"?>



<LinearLayout

xmlns:android = "http://schemas.android.com/apk/res/android"

android:layout_width = "match_parent"

android:layout_height = "match_parent"

android:background = "@color/green">



</LinearLayout>
复制代码


(3)主Activity实现:
import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.view.ViewStub;

import android.view.View.OnClickListener;

import android.widget.Button;



public class ViewStubActivity extends Activity {



private ViewStub mViewStub;



private Button mShow;



@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);



mViewStub = (ViewStub) findViewById(R.id.viewStub);



mShow = (Button) findViewById(R.id.show);

mShow.setOnClickListener(new OnClickListener() {

public void onClick(View view) {

if (mViewStub != null) {

mViewStub.inflate();

}

}

});

}



}
复制代码


  参考:
   1、http://blog.csdn.net/hitlion2008/article/details/6737537
    2、 http://blog.csdn.net/mayingcai1987/article/details/6238609
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-11 01:54 , Processed in 0.292838 second(s), 34 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表