2016-02-12 69 views
2
package com.example.dell.helloworld; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Toast; 

public class MainActivity extends AppCompatActivity { 

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

    public void showToast(View view) 
    { 
     Toast t= new Toast(this); 
     LayoutInflater inflater=getLayoutInflater(); 
     View v=inflater.inflate(R.layout.toast, (ViewGroup) findViewById(R.id.toastViewGroup)); 
     t.setView(v); 
     t.show(); 


    } 
} 

从android开发人员网站 findViewById使用提供ID搜索子视图。findViewById是如何工作的?

在上面的代码中,谁是父视图,谁的孩子正在搜索给定的ID?

回答

1

Activity的情况下,findViewById从作为从布局资源膨胀的视图层级的活动的内容视图开始搜索(设置为setContentView)。

+0

因此,从'R.layout.toast'夸大的'View'被设置为内容视图的子项? 如果是,那么为什么它没有显示,只要它膨胀? – q126y

+1

@ q126y你不是在调用方法... –

+0

@ cricket_007我在按钮单击时调用该方法。我所说的是,如果从'R.layout.toast'夸大的'View'被设置为活动的根'View'的孩子,为什么它没有显示出来,只要它膨胀了?我试图在膨胀的视图上设置'.setVisibility(View.VISIBLE)'。 – q126y

1

活动中的根视图由setContentView(int layoutId)setContentView(View rootView)决定。

在你的情况下,

setContentView(R.layout.activity_main); 

因此,任何调用您对findViewById将从activity_main.xml查找的ID。

如果无法找到您指定的ID,它将返回空值。


值得一提的是,你是不是调用一个方法,这是典型的面包的制作过程。

Toast.makeText(getApplicationContext(), "Hello toast!", Toast.LENGTH_SHORT).show(); 
+0

“因此,您对findById进行的任何调用都将从activity_main.xml中查找id。” - 但是我正在使用的id在toast.xml中,作品。 – q126y

+0

在你显示的代码中,findViewById **是在activity_main上调用的,因为你是从Activity类调用的(比如'this.findViewById')。如果你想在吐司布局上调用它,那么你需要执行'v.findViewById'。如果它按照当前的方式工作,那么我想你已经在两个XML文件中重复了'R.id'的值 –

+0

http://pastebin.com/sXrTpDc0 http://pastebin.com/QLbbLUdL我没有复制这个id。 – q126y