草庐IT

java - 有人可以解释膨胀方法吗?深入理解Android View

coder 2023-08-31 原文

我想更深入地了解 Android 的工作原理,并且我需要有人来解释 View 在“幕后”实际上是如何工作的。

在正常过程中,我们会在扩展 Activity 的 onCreate 方法中使用方法“setContentView(R.layout.ourlayoutfile)”膨胀(这是正确的词吗?)来自 XML 的 View 。然后我们将从该 XML 中找到 View 。

快速示例:如果我们需要查找按钮,我们需要首先调用“setContentVIew()”,然后在我们的按钮上调用“findViewById”。然后我们可以分别使用这个按钮/ View 。

我最近开始玩 LayoutInflater,因为我到了无法帮助自己使用“setContentView”方法的地步,令我惊讶的是我发现我的 Android 知识非常糟糕。我什至无法管理 LayoutInflater 工作。我很尴尬。

一天后,我设法使用 LayoutInflater 扩充 View 。其实这并不难,我从一开始就已经很接近了但是有一个参数我不知道该传入什么。请看这段代码:(这一切都发生在 Activity 的 onCreate 方法中)

View v = getLayoutInflater().inflate(R.layout.activity_main, (ViewGroup) getWindow().getDecorView());



    final Button b = (Button) v.findViewById(R.id.button1);
    final TextView tv = (TextView) v.findViewById(R.id.textView1);

    b.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {


            tv.setText("Just random text");
        }
    });

}

这段代码工作正常,但我遇到的问题实际上是这行代码:

getLayoutInflater().inflate(R.layout.activity_main, null);

我总是传递“null”参数,当然它没有用。即使在文档中它也说这个参数是可选的! (为什么?,如果需要的话)?

我做了简单的布局。请使用 HiearchyViewer 查看它以及它的外观:

上图中的第二个参数是什么,为什么我们需要它?可能将我的布局( R.layout.activity_main )与 Android 提供的 View (从左到右的第一个 View - 父 View )连接起来。如果是这样,为什么 android 不自动连接这两个?!

如果有人能告诉我(或发布链接),我将非常高兴了解有关 View 的有用信息。另外,如果我能获得一些指向 View 工作原理等网站的链接,那就太好了。有用的东西。

如果有人会否决我的问题,请解释。非常感谢大家!

最佳答案

您现在可能已经知道,Android 中的每个可见组件都是一个View。这包括 ButtonSpinnerTextViewEditText 等。您对我们访问程序中 xml 文件中定义的 View 的方式也是正确的,方法是对其进行扩充,然后使用它的 id 查找 View 。通常的方法是使用 setContentView() 方法。

但是有一个名为 LayoutInflater 的非常有用的类可用于“膨胀”布局。现在考虑这样一种情况,您在使用 setContentView() 方法扩充的 xml 文件中有一个 ListView。在此 ListView 中,您希望项目包含一个 ImageView 和一个 TextView。默认列表项只有一个 TextView。因此,您决定编写一个自定义适配器,您将在其中使用新的 listitems.xml,其中定义了 TextViewImageView。现在你不能在这种情况下使用 setContentView(),因为它会在整个 Activity 中膨胀这个布局,这显然是你不想要的。因此,在这种情况下,您可以使用 LayoutInflater 来帮助您。您使用 inflate() 方法临时膨胀布局。第一个参数采用需要扩充的布局文件。第二个参数是这个新膨胀的布局的根。在我们的例子中,它可以设置为 ListView,布局将在其中实际膨胀。

因此,当您使用此 inflate() 方法时,将返回一个 View,其中包含膨胀后的 xml 中的 View 。现在有了这个返回的 View 实例,您可以调用 findViewById() 来获取包含的 View ,将文本设置为 TextView 并将图像源设置为 ImageView .

通常情况下,您最终会使用 LayoutInflater,因为它的用例比本次讨论的范围更广。

关于java - 有人可以解释膨胀方法吗?深入理解Android View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19862456/

有关java - 有人可以解释膨胀方法吗?深入理解Android View的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  5. Ruby 方法() 方法 - 2

    我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby​​-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco

  6. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  7. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  8. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  9. ruby - Highline 询问方法不会使用同一行 - 2

    设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案

  10. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

随机推荐