精华内容
下载资源
问答
  • 2014-03-05 21:49:23

    view实例化

    view实例化本来是很简单的东西,但是由于Android和java都没搞过,导致自己写代码的时候出现很多的问题

    一:纯粹的在java文件中定义类的实例化

        eg:A a =new A(this)   ;//后面的A其实是A类中的构造函数

        只是纯在XML中定义的类其实都是调用的一个参数那个构造函数,所以上面那样实例化是正确的

    二:在XML中创建的自定义view的实例化要用final A a =(A)findViewById(R.id.x);

        这种实例化的方式不仅把类A实例化了,而且相当于绑定了组件

        注:这种方法实例化的时候记得activity中oncrate函数里的setcontentview(R.Layout.x)要写在最上面

        此条语句的意思也就是把XML文件的代码转化为java的代码,只有转成java的代码了才能用其他语句运用XML中的内容,这样解释貌似合理

    eg:setContentView(R.layout.activity_main);
        final HuiJi plane = (HuiJi) findViewById(R.id.plane);

        plane.currentX = metrics.widthPixels / 2;//cuurentx是HuiJi类中的变量
        plane.currentY = metrics.heightPixels - 40;

        如果setContentView(R.layout.activity_main);放到实例化的下面了则编译的时候不会报错,但是运行的时候logcat会报错

                                        这就是我遇到的错误

    更多相关内容
  • 为了便于理解,我们可以将它与findViewById()作比较,二者都是实例化对象,不同的是findViewById()是找xml布局文件下的具体widget控件实例化,而LayoutInflater找res/layout/下的xml布局文件来实例化的。...
  • View实例化流程(高级)

    千次阅读 2016-11-17 20:24:04
    View实例化流程(高级) 小智 原理:View通过LayoutInflater实现加载 我们一般讲的先把View实例化成对象通过3种方式去实现: 1.LayoutInflater layoutInflater=(LayoutInflater) context.getSystemService...
    View 实例化 流程(高级)
    小智
    原理:View通过LayoutInflater实现加载

    我们一般讲的先把View实例化成对象通过3种方式去实现:
    1.LayoutInflater layoutInflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      layoutInflater.inflate(resourceId, root);
    2.LayoutInflater layoutInflater=LayoutInflater.from(context);
      layoutInflater.inflate(resourceId, root);
    3.View view=View.inflater(context,resourceId, root);
    这三种方式的作用都是一样的,第二种其实是对第一种的封装,第三种是对第二种的封装。
    使用:
    我们一般都是使用这种方式去拿到一个布局,然后添加到另一个布局上面,步骤也很简单。我们来看一下以下代码。
    activity_main.xml:
       
    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    2. android:id="@+id/main_layout"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent" >
    5. </LinearLayout>
    view.xml
       
    1.        
      1. <Button xmlns:android="http://schemas.android.com/apk/res/android"
      2. android:layout_width="wrap_content"
      3. android:layout_height="wrap_content"
      4. android:text="Button" >
      5. </Button>


    MainActivity java代码
       
    1.        
      1. public class MainActivity extends Activity {
      2. private LinearLayout mainLayout;
      3. @Override
      4. protected void onCreate(Bundle savedInstanceState) {
      5. super.onCreate(savedInstanceState);
      6. setContentView(R.layout.activity_main);
      7. mainLayout = (LinearLayout) findViewById(R.id.main_layout);
      8. LayoutInflater layoutInflater = LayoutInflater.from(this);
      9. View buttonLayout = layoutInflater.inflate(R.layout.button_layout, null);
      10. mainLayout.addView(buttonLayout);
      11. }
      12. }

    使用上很简单,但是我们有一个疑问,main布局是怎么被显示出来的呢?setContentView(layoutid)
    我们刨根揭底,进入他的源码,可以发现setContentView()方法的内部也是使用LayoutInflater来加载布局的,现在我们就可以深入来了解View是怎么去加载的。
    不管我们使用哪个inflate()方法,最终都会调用到LayoutInflate的如下代码
       
    1. public View inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot) {
    2. synchronized (mConstructorArgs) {
    3. final AttributeSet attrs = Xml.asAttributeSet(parser);
    4. mConstructorArgs[0] = mContext;
    5. View result = root;
    6. try {
    7. int type;
    8. while ((type = parser.next()) != XmlPullParser.START_TAG &&
    9. type != XmlPullParser.END_DOCUMENT) {
    10. }
    11. if (type != XmlPullParser.START_TAG) {
    12. throw new InflateException(parser.getPositionDescription()
    13. + ": No start tag found!");
    14. }
    15. final String name = parser.getName();
    16. if (TAG_MERGE.equals(name)) {
    17. if (root == null || !attachToRoot) {
    18. throw new InflateException("merge can be used only with a valid "
    19. + "ViewGroup root and attachToRoot=true");
    20. }
    21. rInflate(parser, root, attrs);
    22. } else {
    23. View temp = createViewFromTag(name, attrs);
    24. ViewGroup.LayoutParams params = null;
    25. if (root != null) {
    26. params = root.generateLayoutParams(attrs);
    27. if (!attachToRoot) {
    28. temp.setLayoutParams(params);
    29. }
    30. }
    31. rInflate(parser, temp, attrs);
    32. if (root != null && attachToRoot) {
    33. root.addView(temp, params);
    34. }
    35. if (root == null || !attachToRoot) {
    36. result = temp;
    37. }
    38. }
    39. } catch (XmlPullParserException e) {
    40. InflateException ex = new InflateException(e.getMessage());
    41. ex.initCause(e);
    42. throw ex;
    43. } catch (IOException e) {
    44. InflateException ex = new InflateException(
    45. parser.getPositionDescription()
    46. + ": " + e.getMessage());
    47. ex.initCause(e);
    48. throw ex;
    49. }
    50. return result;
    51. }
    52. }
    很明显,这是一个pull解析,通过pull解析去解析布局文件,定位到第23行createViewFromTag()。然后createViewFromTag()又去调用createView(),再通过反射创建出View实例。这样就创建出根布局了。
    创建出根布局后,我们还需要创建包裹在里面的布局
             接下来定位到31行调用了rInflate()方法来循环遍历出这个布局下的子元素。
    展开全文
  • 在Activity中我们需要实例化很多layout控件的...第种:实例化在Activity中setContextView(R.layout...)的布局中的button,textview等控件 private ListView listView listView= (ListView) findViewById(R.id.lis

    在Activity中我们需要实例化很多layout控件的对象,但是对象分为很多情况,以下就为主要的几种情况:


    第一种:实例化在Activity中setContextView(R.layout...)的布局中的button,textview等控件

    private ListView listView
    listView= (ListView) findViewById(R.id.list_view_home);

    第二种:实例化在Activity中setContextView(R.layout...)的布局中的其他子布局

    <?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"
        android:background="@color/qgreen">
    <!--空间大小用px,局利用sp,dp-->
    
        <!--加载标题样式文件-->
    
        <include android:id="@+id/layout_title_bar" layout="@layout/title_bar"/>
    
    
        <include android:id="@+id/layout_progress" layout="@layout/progress" />
    
    
        <ListView
            android:id="@+id/list_view_home"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:dividerHeight="1dp"
            android:cacheColorHint="#000000"
            android:paddingBottom="80dp"
            /><!--android:divider="@drawable/line"-->
    
    
    </LinearLayout>
    对于上面的<include>中的值布局,实例化代码如下:应该统一用View来实例化对象,后面与上面一样:

    private View progressView;
    private View titleView;

    progressView=findViewById(R.id.layout_progress);          //R.id.layout_progress为home不居中的progress控件的id
    titleView=findViewById(R.id.layout_title_bar);           //这个为标题样式的对象

    第三种:实例化没有在Activity中setContextView(R.layout...)的其他布局

    private View MoreMsgView;              //这个对象用于加载more布局
    MoreMsgView=View.inflate(this,R.layout.the_more_layout,null);      //inflate()的作用就是将一个用xml定义的布局文件查找出来,注意与findViewById()的区别,inflate是加载一个布局文件,而findViewById则是从布局文件中查找一个控件。

    也是用view来实例化对象


    第四种:实例化没有在Activity中setContextView(R.layout...)的其他布局,中的控件

    private View MoreMsgView;              //这个对象用于加载more布局
    MoreMsgView=View.inflate(this,R.layout.the_more_layout,null);      //inflate()的作用就是将一个用xml定义的布局文件查找出来,注意与findViewById()的区别,inflate是加载一个布局文件,而findViewById则是从布局文件中查找一个控件。

    上面为加载其他布局,下面为该布局中的控件对象的实例化:

    private LinearLayout linearLayoutMore;
    linearLayoutMore= (LinearLayout) MoreMsgView.findViewById(R.id.llyt_loading);
    多了一个MoreMsgView.这个对象


    第五种:在不是Activity的类中,实例化一个该类没有加载的布局

    首先:   

    private LayoutInflater mlayoutInflater;
      mlayoutInflater=LayoutInflater.from(context);
       //在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById()。不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;而findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。 具体作用:
    
    //   1、对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入;
    
      // 2、对于一个已经载入的界面,就可以使用Activiyt.findViewById()方法来获得其中的界面元素。

    然后:Linearlayout为布局的类型,为线性布局

    private LinearLayout mlinearLayout;
    mlinearLayout= (LinearLayout) mlayoutInflater.inflate(R.layout.refresh_listview,this,false);

    之后:

    public  ImageView mimageView;
    public TextView mtextView;
    mimageView= (ImageView) mlinearLayout.findViewById(R.id.img_View);
    mtextView= (TextView) mlinearLayout.findViewById(R.id.refresh_textView);


    第六种:不是Activity的类在其中,加载布局,实例化控件

    LayoutInflater layoutInflater = LayoutInflater.from(getContext());
    View view = layoutInflater.inflate(R.layout.tool_bar, null);
    
    mTextTitle = (TextView) view.findViewById(R.id.toolbar_title);
    mSearchView = (EditText) view.findViewById(R.id.toolbar_searchview);
    mRightButton = (Button) view.findViewById(R.id.toolbar_rightButton);


    以上就是所有对象的实例化的总结

    展开全文
  • ButterKnife实例化控件

    千次阅读 2018-09-29 09:48:55
    用于快速实例化控件的种插件   安装ButterKnife 第步,下载插件,如图操作 AndroidStudio 先组合键操作:Ctrl+Alt+S,弹出窗口选中Plugins选项   之后点击按钮Browse repositories...

    目录

    介绍ButterKnife

    安装ButterKnife

    使用ButterKnife


    介绍ButterKnife

    (黄油刀)

    用于快速实例化控件的一种插件

     

    安装ButterKnife

    第一步,下载插件,如图操作

    AndroidStudio

    先组合键操作:Ctrl+Alt+S,弹出窗口选中Plugins选项

     

    之后点击按钮Browse repositories...;

     

    输入butter,选中图中这一选项,把这个插件下载安装,就像》》快速实例化控件《《一样下载安装

    我这里下载安装好了,所以不会提示下载安装

     

    点击ok,点击restart重启AndroidStudio就安装完成了

     

    使用ButterKnife

    第一步,导入依赖

    implementation 'com.jakewharton:butterknife:8.8.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

    这两句依赖加上去,

    第二步,创建布局文件

    来个简单的布局,给定一个控件id

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
        <ImageView
            android:id="@+id/image"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="10" />
    
        <Button
            android:id="@+id/btn"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />
    
    </LinearLayout>

     

    光标放在activity_main 之上,之后右击或者组合键ALT+Insert

     

    右击之后,选中Generate...,组合键不用看这一步骤

     

    选中Generate ButterKnife Injections,这个就是下载的插件,点进去

     

    之后提示你是这样的

    在你布局文件中加过id的在这里都可以显示出来,onclick一列代表的是事件,可以给按钮加上事件,也可以imageview加上事件,这里只加上按钮的点击事件(选中第二行的OnClick),最后一列是代表name,默认是和id一样的,当然可以修改(我一般不修改)
    底下还有两个选项,Create ViewuHolder和Split OnClick methods,根据需求加上

    之后点击Confirm,就完成了实例化控件了

     

    效果如下,会给你自动绑定ButterKnife,在下面可以直接写按钮事件

     

    写一个吐司,很简单,快去试试吧

    展开全文
  • Android解决多Fragment切换时布局重新实例化问题

    万次阅读 多人点赞 2016-07-12 15:45:30
    如果每切换次就实例化一次的话,FragmentManager管理下的栈也会爆满,最终会导致手机卡顿,这很明显不是正确的Fragment使用姿势,这时,我们就需要使用show()、hide()、add()了,正确的切换方式是add(),切换时...
  • 本文出自:【openXu的博客】  在Activity完全解析的第篇文章 Activtiy完全解析(、Activity的创建过程)中,我们分析了从调用startActivtiy()到Activtiy创建完成的整个过程。其中step20:ActivtiyThread.h
  • 相信大家对于在一个Activity中启动另一个Activity非常熟悉,具体代码如下。 searchView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent mintent=n
  • > 转载请标明出处: [http://blog.csdn.net/airsaid/article/details/54294144](http://blog.csdn.net/airsaid/article/details/54294144) ... [TOC] # 前言 在前面的博客当中,我们学习了 View
  • LayoutInflater.inflate...假设我们有一个需要实例化的布局文件menu_item.xml: <LinearLayout xmlns:android=http://schemas.android.com/apk/res/android android:layout_width=match_parent android:layout_he
  • 使用newInstance()来实例化fragment

    千次阅读 2016-12-04 20:06:36
    这种设计是一种静态工厂方法,让我们在初始和设置一个新的fragment的时候省去调用它的构造函数和额外的setter方法。为你的Fragment提供静态工厂方法是一种好的做法,因为它封装和抽象了在客户端构造对象所需的步骤...
  • Carson带你学Android:深入分析自定义View Layout过程

    万次阅读 多人点赞 2017-02-20 11:37:10
    今天,我将全面总结自定义View原理中的Layout过程,我能保证这是市面上的最全面、最清晰、最易懂的 文章较长,建议收藏等充足时间再进行阅读 阅读本文前,请先阅读文章 (1)自定义View基础 -
  • View view = inflater.inflate(R.layout.info_window, mapView); ImageView img = (ImageView) view.findViewById(R.id.image_view); ** Glide.with(MainActivity.this).load(picture.getImgId()).asBitmap()....
  • Activity中获取当前UI中的 layout 1,fi
  • 让多Fragment 切换时不重新实例化

    万次阅读 2015-02-08 20:17:14
    翻看了Android官方Doc,和一些组件的源代码,发现,replace()这个方法只是在上一个Fragment不再需要时采用的简便方法。 正确的切换方式是add(),切换时hide(),add()另一个Fragment;再次切换时,只需hide()...
  • Android 自定义View(inflate()模式)

    万次阅读 2018-12-18 15:50:13
    1.创建LayoutInflater实例 有两种方式 1. LayoutInflater layoutInflater= LayoutInflater.from(MainActivity.this); LayoutInflater layoutInflater= (LayoutInflater) getSystemService(Context....
  • 前言 在Android里,获取View宽高的时机是个老生常谈的话题了。众所周知,在Oncreate里直接调用View.getWidth或者View.getMeasuredWidth返回都是0。所以获取宽高时机很重要...而本文主要讨论的是其中的一个解决方法。V
  • 先看效果图:然后在看项目和代码:、 新建空白的项目:Empety Activity二、 先添加依赖:在build.gradle 的dependencies里面添加 compile 'com.android.support:design:26.1.0' 三、 先看MainActivity布局...
  • Android碎片Fragment实例一

    千次阅读 2017-12-26 22:06:51
    一:内容概览 我们再android中所说的碎片也就是针对不同设备的屏幕大小设计不同的适配...2.1我们首先看一下我们的实例效果图:我们可以看到在10英寸的屏幕平板中,将当前的Activity(也就是一个活动界面)嵌套两个
  • 安卓NavigationView使用方法

    万次阅读 多人点赞 2018-09-15 16:17:58
    介绍NavigationView 布局文件、标签属性 导入依赖 使用Design下的NavigationView前导入依赖步骤 在这页面中直接找到design这依赖,点击后再点击这两窗口上的OK按钮,等待编译完成就完成导入了! (可能...
  • Android开发中,时间轴的 UI需求非常常见,如下图: 本文将结合 自定义View & RecyclerView的知识,手把手教你实现该常见 & 实用的自定义View:时间轴 目录1. 知识储备本文采用 自定义View & RecyclerView 实现时间...
  • Android中View的创建流程解析

    千次阅读 2022-05-05 10:51:18
    方法使用很简单直接把layout布局文件放进去就可以了。那么具体内部是怎么将它显示到桌面的呢,今天就从setContentView()来解析一下Android中View的创建过程。 打开androidx/appcompat/app/AppCompatActivity....
  • 篇文章带你走近Android自定义view

    千次阅读 多人点赞 2021-10-14 14:38:42
    文章目录系列文章目录前言一、为什么要自定义view二、先看看一个超级简单的自定义view(三个构造函数)三、了解手机的坐标系四、使用Canvas画一个折线图(重写onDraw()方法)五、如何自定义属性,且在view中获取到...
  • 我的TextView明明实例化了,为啥setText时候还是给我报空指针异常啊!?
  • 简单实现步骤: 两方法,
  • 前言前一段时间写过两篇关于View的文章 Activity中的Window的setContentView 和 遇见LayoutInflater&Factory 。分析了Activity设置页面布局到页面View元素进行布局到底经历了一个怎么样的过程?
  • 主要写写自己对接口实例化的理解:关于接口大家应该都清楚,类实现接口必须实现接口的所有方法,属性除外。那么既然有类来实例化接口,那么为什么还要把类的实例转换为接口,也就是我们所说的接口的实例化。这样一来...
  • 不过我们庆幸的看到的是,ActionBar在设计的时候就并不是以一个强类型的姿态存在,我们发现它并不是以一个View的方式存在,而跟Fragment一样是一个很单纯的工具类。这种设计正好屏蔽了内部的实现,从而可以让我们对它...
  • 篇文章看明白 Activity 与 Window 与 View 之间的关系

    万次阅读 多人点赞 2018-03-01 10:24:31
    Android - Activity 与 Window 与 View 之间的关系 概述 我们知道 Activity 启动后就可以看到我们写的 Layout 布局界面,Activity 从 setContentView() 到显示中间做了什么呢?下面我们就来分析下这过程。 如...
  • 在这种情况下,newInstance()方法是一种“静态工厂方法",让我们在初始和设置一个新的fragment的时候省去调用它的构造函数和额外的setter方法。为你的Fragment提供静态工厂方法是一种好的做法,因为它封装和抽象了在...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 90,545
精华内容 36,218
关键字:

layout实例化一个view