`
xiaoheliushuiya
  • 浏览: 401918 次
文章分类
社区版块
存档分类
最新评论

SetContentView 到底Set去哪里呢?

 
阅读更多

学一门新的语言或者技术,一般都 从HelloWorld开始的,我们学习Android也是一样的,

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);	
        setContentView(R.layout.main);
		
    }

在我们的MainActivity中,只要这样简单地调用setContentView就可以将main里面的东西给显示在手机界面上了。

很简单的东西,所以都没有怎么去想过为什么这样调用setContentView就可以了,直到今天。

今天,看了几篇博客,讲到了View是如何绘制的,及setContentView是如何开始的,才发现自己思维太简单了,只想着用而用,没有去思考为什么这么用就可以,缺乏总结。

所以觉得还是得先记录一下自己的理解。

我们都知道,在手机界面上,我们要展现Button,TextView, ImageView等控件,我们必须将其放在一个布局,可以是我们自定义的布局,也可以是Android本身 提供的布局。

但是,这所有的布局,其实最终都是放在一个叫DecorView的最顶层,最外层的FrameLayout上。

Android本身提供了一些布局,比如最常见的R.layout.screen_title,包含有Title (标题栏) 和 Content(内容)的一个布局,如果我们没有设置什么Feature 之类的属性,一般就是用这个layout.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:fitsSystemWindows="true">
        <FrameLayout
            android:layout_width="match_parent" 
            android:layout_height="?android:attr/windowTitleSize"
            style="?android:attr/windowTitleBackgroundStyle">
            <TextView android:id="@android:id/title" 
                style="?android:attr/windowTitleStyle"
                android:background="@null"
                android:fadingEdge="horizontal"
                android:gravity="center_vertical"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
        </FrameLayout>
        <FrameLayout android:id="@android:id/content"
            android:layout_width="match_parent" 
            android:layout_height="0dip"
            android:layout_weight="1"
            android:foregroundGravity="fill_horizontal|top"
            android:foreground="?android:attr/windowContentOverlay" />
    </LinearLayout>

当我们调用Activity.SetContentView的时候,其实是调用对应Window类(具体是PhoneWindow类)的setConentView,在这个方法中,会去初始化DecorView, 并根据之前设定的Feature属性,选择一个layout(比如R.layout_screen_title),将其添加到DecorView中,并获取其中的content子视图。

如上面所示,其实Title所对应的FrameLayout 就是标题栏, Content 所对应的FrameLayout 就是内容布局。我们自定义的main.xml 其实就是展示在这个Content 上。

大概结构如下:



分享到:
评论

相关推荐

    浅析Android Dialog中setContentView()方法

    概述 Dialog在Android中是一个很优秀的工具。在使用Dialog时,我们一般都会自定义要显示的内容布局。Dialog自带了三个方法来支持自定义内容布局。 public void setContentView (int layoutResID);...set

    深入解析Android中的setContentView加载布局原理

    对于Android的开发者来说,setContentView大家再熟悉不过了,在我们的Activity中首先就是要用它加载我们的布局,但是应该有一部分人是不知道加载布局的原理,也包括我,今天就从源码的角度分析setContentView加载...

    Android开发中setContentView和inflate的区别分析

    本文实例讲述了Android开发中setContentView和inflate的区别。分享给大家供大家参考,具体如下: 一般用LayoutInflater做一件事:inflate inflate这个方法总共有四种形式(见下面),目的都是把xml表述的layout转化...

    android 侧拉菜单控件 SlideMenu

    是一个很好的一个控件,可以很方便地集成到项目中去,是一个老外写的,很好用 public class SlidingExample extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate...

    Android系统设置闹钟

    setContentView(R.layout.activity_main); intent=new Intent(MainActivity.this,pageActivity.class); pendingIntent=PendingIntent.getActivity(MainActivity.this, 0, intent, 0); calendar=...

    android时间控件

    setContentView(R.layout.activity_main); initializeViews(); final Calendar c = Calendar.getInstance(); mYear = c.get(Calendar.YEAR); mMonth = c.get(Calendar.MONTH); mDay = c.get...

    Android代码-ArcToolbarView

    ArcToolbarView An Arc view for the android Toolbar or anywhere. Download Gradle: dependencies { ...Declare your Toolbar with ArcToolbarView. ... setContentView(R.layout.activity_arc_toolbar_view)

    仿QQ气泡拖动删除

    setContentView(R.layout.activity_main); root = (RelativeLayout) findViewById(R.id.activity_main); messageIcon = (ImageView) findViewById(R.id.message_icon); contactIcon = (ImageView) findViewById...

    快递和电话号码归属地查询(android)

    setContentView(R.layout.main); txtMsg = (TextView) findViewById(R.id.txtMsg); txtExpressnum = (EditText) findViewById(R.id.txtExpressnum); btnSearch = (Button) findViewById(R.id.btnSearch); ...

    全国城市检索

    setContentView(R.layout.main); provinceSpinner=(Spinner)findViewById(R.id.spinner1); citySpinner=(Spinner)findViewById(R.id.spinner2); districtSpinner=(Spinner)findViewById(R.id.spinner3); ...

    viewpager图片滚动缩放

    setContentView(R.layout.main); //放大按钮 zoomIn = (Button) findViewById(R.id.zoom_in); //缩小按钮 zoomOut = (Button) findViewById(R.id.zoom_out); zoomIn.setOnClickListener(this); zoomOut....

    真正实现自动轮播的广告栏Banner

    setContentView(R.layout.activity_main); vPager = (ViewPager) findViewById(R.id.vPager); adapter = new CustomPagerAdapter(vPager); vPager.setAdapter(adapter); } private class ...

    音乐播放器(J2ME)

    10 setContentView(R.layout.mylayout); 11 二是在AndroidManifest.xml中: 2 android:label="" 3 android:theme="@android:style/Theme.NoTitleBar.Fullscreen"&gt; 然而,这两种方法都不能达到我们在视频播放...

    图片列表【范型】

    setContentView(R.layout.main); list=(ListView)findViewById(R.id.list); new Thread() { @Override public void run() { super.run(); String str = new GetDataFromJson...

    打包html.doc

    1、下载eclipse、sdk工具包,安装jdk环境 检测jdk: Cmd→ java - version ...直接下载adt bundle 集成了eclipse adt 和sdk 然后直接使用eclipse 打开安卓项目 ...右键项目→new→other→android→android icon set

    访微信语音聊天

    setContentView(R.layout.activity_chat); initViews(); initDatas(); initEvents(); } private void initViews() { mListview = (ListView) findViewById(R.id.listview_chat); mAudioButton = ...

    freepager-一个ViewPager的库,支持水平翻页,上下翻页,无限翻页.zip

    this.setContentView(R.layout.main); InfiniteVerticalPager verticalPager = (InfiniteVerticalPager) this.findViewById(R.id.viewPager); verticalPager.setFactory(this); verticalPager....

    Android HTML5做的客户端,超棒的效果 源码

    setContentView(R.layout.activity_webview); ButterKnife.bind(this); String url = getIntent().getStringExtra(EXTRA_URL); mWebView.setWebViewClient(new WebViewClient()); WebSettings webSettings = ...

    Android之泡泡效果bubble.rar

    // set full screen requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); fl = new ...

    settings:本地设置,本地配置

    她的活动nin biryaşamdöngüsüvar onCreate-&gt;活动başladığındailkçalışan方法onCreate方法集setContentView-&gt;活动ningörselyapısınıbelirler 她的活动来自AndroidManifest.xml,引用了olmakzorundad...

Global site tag (gtag.js) - Google Analytics