精华内容
下载资源
问答
  • Android view实例化

    千次阅读 2014-03-05 21:49:23
    view实例化 view实例化本来是很简单的东西,但是由于Android和java都没搞过,导致自己写代码的时候出现很多... 只是纯在XML中定义的类其实都是调用的一个参数那个构造函数,所以上面那样实例化是正确的 二:在XML中

    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会报错

                                        这就是我遇到的错误

    展开全文
  • 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. <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. 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()方法来循环遍历出这个布局下的子元素。
    展开全文
  • 我使用两 buttons 创建了 mainLayout。...这 view 是添加在 main layout下面的。我想把 view 添加在 addView 按钮的右下边,removeView 按钮的上面,但是不在 main Layout 的底部。 如何实现?
  • 在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);


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

    展开全文
  • 实例化为View对象1: LayoutInflater inflater = (LayoutInflater)context.getSystemService (Context.LAYOUT_INFLATER_SERVICE); LinearLayout layout = (LinearLayout)inflater.inflate(R.layout.list_item,...

    实例化为View对象1:

    LayoutInflater inflater = (LayoutInflater)context.getSystemService
    (Context.LAYOUT_INFLATER_SERVICE);
    LinearLayout layout = (LinearLayout)inflater.inflate(R.layout.list_item,null);
    
    实例化为View对象2:

    LinearLayout layout = (LinearLayout)LayoutInflater.from(context).inflate
    (R.layout.list_item,null);
    实例化为View对象3:

    LinearLayout layout = (LinearLayout)View.inflate(context,R.layout.list_item,null);
    实例化为View对象4:

    LayoutInflater inflater =getLayoutInflater().inflate(R.layout.list_item,null);

    附上参考网址:http://www.2cto.com/kf/201205/131136.html

    展开全文
  • 今天,我将全面总结自定义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
  • 简单实现步骤: 两方法,
  • Android解决多Fragment切换时布局重新实例化问题

    万次阅读 多人点赞 2016-07-12 15:45:30
    如果每切换次就实例化一次的话,FragmentManager管理下的栈也会爆满,最终会导致手机卡顿,这很明显不是正确的Fragment使用姿势,这时,我们就需要使用show()、hide()、add()了,正确的切换方式是add(),切换时...
  • //利用对话框来加载View,View中是一个复选框列表 new AlertDialog.Builder(MainActivity.this).setView(selectView). setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override ...
  • 前言 在Android里,获取View宽高的时机是个老生常谈的话题了。众所周知,在Oncreate里直接调用View.getWidth或者View.getMeasuredWidth返回都是0。所以获取宽高时机很重要...而本文主要讨论的是其中的一个解决方法。V
  • Android View layout方法的简单使用案例

    千次阅读 2015-04-23 18:31:10
    layout的妙用
  • Android:手把手教你写一个完整的自定义View

    万次阅读 多人点赞 2017-03-14 10:11:27
    今天,我将手把手教你写一个自定义View,并理清自定义View所有应该的注意点 阅读本文前,请先阅读我写的一系列自定义View文章 自定义View基础 - 最易懂的自定义View原理系列(1) 自定义View Measure过程 - 最...
  • // 顶点属性最多vec4 输入 实际上有4vec4输入构造这mat4 layout(location = 3) in mat4 instanceMatrix; uniform mat4 projection; uniform mat4 view; out vec2 TextCoord; void main() { gl_Position = ...
  • 主要写写自己对接口实例化的理解:关于接口大家应该都清楚,类实现接口必须实现接口的所有方法,属性除外。那么既然有类来实例化接口,那么为什么还要把类的实例转换为接口,也就是我们所说的接口的实例化。这样一来...
  • 使用newInstance()来实例化fragment

    千次阅读 2016-12-04 20:06:36
    这种设计是一种静态工厂方法,让我们在初始和设置一个新的fragment的时候省去调用它的构造函数和额外的setter方法。为你的Fragment提供静态工厂方法是一种好的做法,因为它封装和抽象了在客户端构造对象所需的步骤...
  • 本文出自:【openXu的博客】  在Activity完全解析的第篇文章 Activtiy完全解析(、Activity的创建过程)中,我们分析了从调用startActivtiy()到Activtiy创建完成的整个过程。其中step20:ActivtiyThread.h
  • View是所有控件的一个基类,无论是布局(Layout),还是控件(Widget)都是继承自View类。只不过layout一个特殊的view,它里面创建一个view的数组可以包含其他的view而已。  这一篇文章把所有的layout和widget都统称...
  • 之前我有承诺过,会在View话题上多写几篇博客,讲View的工作原理,以及自定义View的方法。现在前半部分的承诺已经如约兑现了,那么今天我就要来兑现后面部分的承诺,讲讲自定义View的实现方法,同时这也是...
  • mInflater = getLayoutInflater(); layout1 = mInflater.inflate(R.layout.personalcenter_1, null); ib_friends = (ImageButton)layout1.findViewById(R.id.ib_...实例化include进来的布局中的组件 View subL
  • Android碎片Fragment实例一

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

    千次阅读 2016-03-28 18:26:37
    我们在添加视图文件的时候有两种方式,种是通过在xml文件定义layout,另种方式是在java代码中动态生成布局文件。 在xml中定义的layout要想转化为view,需要使用到LayoutInflater类。 1.构造xml文件 ...
  • 让多Fragment 切换时不重新实例化

    万次阅读 2015-02-08 20:17:14
    翻看了Android官方Doc,和一些组件的源代码,发现,replace()这个方法只是在上一个Fragment不再需要时采用的简便方法。 正确的切换方式是add(),切换时hide(),add()另一个Fragment;再次切换时,只需hide()...
  • > 转载请标明出处: [http://blog.csdn.net/airsaid/article/details/54294144](http://blog.csdn.net/airsaid/article/details/54294144) ... [TOC] # 前言 在前面的博客当中,我们学习了 View
  • View是所有控件的一个基类,无论是布局(Layout),还是控件(Widget)都是继承自View类。只不过layout一个特殊的view,它里面创建一个view的数组可以包含其他的view而已。  这一篇文章把所有的layout和widget都...
  • 不过我们庆幸的看到的是,ActionBar在设计的时候就并不是以一个强类型的姿态存在,我们发现它并不是以一个View的方式存在,而跟Fragment一样是一个很单纯的工具类。这种设计正好屏蔽了内部的实现,从而可以让我们对它...
  • 最近在看Google技术文档的时候发现了一种新的方式来实例化Fragment,就是采用静态工厂的方式创建Fragment。我们在使用Android studio创建一个类的时候,选择New ->Fragment->Fragment(Blank)可以很直观的看到这种...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 86,136
精华内容 34,454
关键字:

layout实例化一个view