-
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会报错 这就是我遇到的错误 更多相关内容 -
基于Android在布局中动态添加view的两种方法(总结)
2021-01-05 10:53:26为了便于理解,我们可以将它与findViewById()作一比较,二者都是实例化某一对象,不同的是findViewById()是找xml布局文件下的具体widget控件实例化,而LayoutInflater找res/layout/下的xml布局文件来实例化的。... -
View实例化流程(高级)
2016-11-17 20:24:04View实例化流程(高级) 小智 原理: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:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</LinearLayout>
view.xml-
<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" >
</Button>
MainActivity java代码-
public class MainActivity extends Activity {
private LinearLayout mainLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainLayout = (LinearLayout) findViewById(R.id.main_layout);
LayoutInflater layoutInflater = LayoutInflater.from(this);
View buttonLayout = layoutInflater.inflate(R.layout.button_layout, null);
mainLayout.addView(buttonLayout);
}
}
使用上很简单,但是我们有一个疑问,main布局是怎么被显示出来的呢?setContentView(layoutid)我们刨根揭底,进入他的源码,可以发现setContentView()方法的内部也是使用LayoutInflater来加载布局的,现在我们就可以深入来了解View是怎么去加载的。不管我们使用哪个inflate()方法,最终都会调用到LayoutInflate的如下代码public View inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot) {
synchronized (mConstructorArgs) {
final AttributeSet attrs = Xml.asAttributeSet(parser);
mConstructorArgs[0] = mContext;
View result = root;
try {
int type;
while ((type = parser.next()) != XmlPullParser.START_TAG &&
type != XmlPullParser.END_DOCUMENT) {
}
if (type != XmlPullParser.START_TAG) {
throw new InflateException(parser.getPositionDescription()
+ ": No start tag found!");
}
final String name = parser.getName();
if (TAG_MERGE.equals(name)) {
if (root == null || !attachToRoot) {
throw new InflateException("merge can be used only with a valid "
+ "ViewGroup root and attachToRoot=true");
}
rInflate(parser, root, attrs);
} else {
View temp = createViewFromTag(name, attrs);
ViewGroup.LayoutParams params = null;
if (root != null) {
params = root.generateLayoutParams(attrs);
if (!attachToRoot) {
temp.setLayoutParams(params);
}
}
rInflate(parser, temp, attrs);
if (root != null && attachToRoot) {
root.addView(temp, params);
}
if (root == null || !attachToRoot) {
result = temp;
}
}
} catch (XmlPullParserException e) {
InflateException ex = new InflateException(e.getMessage());
ex.initCause(e);
throw ex;
} catch (IOException e) {
InflateException ex = new InflateException(
parser.getPositionDescription()
+ ": " + e.getMessage());
ex.initCause(e);
throw ex;
}
return result;
}
}
很明显,这是一个pull解析,通过pull解析去解析布局文件,定位到第23行createViewFromTag()。然后createViewFromTag()又去调用createView(),再通过反射创建出View实例。这样就创建出根布局了。创建出根布局后,我们还需要创建包裹在里面的布局接下来定位到31行调用了rInflate()方法来循环遍历出这个布局下的子元素。 -
在Activity中,layout布局中控件的各种实例化
2016-09-28 19:51:03在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
第一步,下载插件,如图操作
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(),切换时... -
Activtiy完全解析(三、View的显示过程measure、layout、draw)
2016-10-17 17:06:09本文出自:【openXu的博客】 在Activity完全解析的第一篇文章 Activtiy完全解析(一、Activity的创建过程)中,我们分析了从调用startActivtiy()到Activtiy创建完成的整个过程。其中step20:ActivtiyThread.h -
Android中Fragment中启动一个Activity,实例化控件。
2017-04-23 20:38:52相信大家对于在一个Activity中启动另一个Activity非常熟悉,具体代码如下。 searchView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent mintent=n -
Android 从0开始自定义控件之 自定义 View 基础实例(十)
2017-01-09 22:34:37> 转载请标明出处: [http://blog.csdn.net/airsaid/article/details/54294144](http://blog.csdn.net/airsaid/article/details/54294144) ... [TOC] # 前言 在前面的博客当中,我们学习了 View 的一 -
Android LayoutInflater.inflate源码分析
2021-01-04 11:27:31LayoutInflater.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基础 - -
glide加载图片错误,提示view为空。但是我已经把view实例化了。求解决
2017-03-30 02:58:33View 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获取布局中的view,以及LayoutInfalter实例化
2014-09-19 11:13:37Activity中获取当前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:131.创建LayoutInflater实例 有两种方式 1. LayoutInflater layoutInflater= LayoutInflater.from(MainActivity.this); LayoutInflater layoutInflater= (LayoutInflater) getSystemService(Context.... -
通过View.post()获取View的宽高引发的两个问题:1post的Runnable何时被执行,2...以及发现Android的一个小bug
2015-11-13 11:18:59前言 在Android里,获取View宽高的时机是个老生常谈的话题了。众所周知,在Oncreate里直接调用View.getWidth或者View.getMeasuredWidth返回都是0。所以获取宽高时机很重要...而本文主要讨论的是其中的一个解决方法。V -
Android Studio 导航栏开发 BottomNavigationView+Fragment 简单实例 超详细
2018-04-25 16:13:11先看效果图:然后在看项目和代码:一、 新建空白的项目: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自定义View实战 :如何优雅实现一个时间轴显示控件?
2017-07-12 10:14:41Android开发中,时间轴的 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中获取到... -
为什么我的控件实例化后还是报空指针异常?
2017-05-30 00:12:30我的TextView明明实例化了,为啥setText时候还是给我报空指针异常啊!? -
反射+多态:生成容器实例化并装好view子类
2014-04-14 23:53:40简单实现步骤: 两个方法, -
ViewRootImpl的独白,我不是一个View(布局篇)
2017-12-11 17:56:02前言前一段时间写过两篇关于View的文章 Activity中的Window的setContentView 和 遇见LayoutInflater&Factory 。分析了Activity设置页面布局到页面View元素进行布局到底经历了一个怎么样的过程? -
由最简单的例子理解接口的实例化和面向接口编程
2016-01-09 15:29:19主要写写自己对接口实例化的理解:关于接口大家应该都清楚,类实现接口必须实现接口的所有方法,属性除外。那么既然有类来实例化接口,那么为什么还要把类的实例转换为接口,也就是我们所说的接口的实例化。这样一来... -
子墨庖丁Android的ActionBar源码分析 (一)实例化
2014-06-16 12:14:33不过我们庆幸的看到的是,ActionBar在设计的时候就并不是以一个强类型的姿态存在,我们发现它并不是以一个View的方式存在,而跟Fragment一样是一个很单纯的工具类。这种设计正好屏蔽了内部的实现,从而可以让我们对它... -
一篇文章看明白 Activity 与 Window 与 View 之间的关系
2018-03-01 10:24:31Android - Activity 与 Window 与 View 之间的关系 概述 我们知道 Activity 启动后就可以看到我们写的 Layout 布局界面,Activity 从 setContentView() 到显示中间做了什么呢?下面我们就来分析下这个过程。 如... -
使用newInstance()来实例化fragment 并传递数据
2017-04-09 13:54:41在这种情况下,newInstance()方法是一种“静态工厂方法",让我们在初始化和设置一个新的fragment的时候省去调用它的构造函数和额外的setter方法。为你的Fragment提供静态工厂方法是一种好的做法,因为它封装和抽象了在...