2016-02-12 1 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?

В приведенном выше коде, кто является родительским видом, чьи дети ищут данный идентификатор?

ответ

1

В случае Activity, findViewById начинает поиск из представления содержимого (установленного с setContentView) деятельности, которая представляет собой иерархию представления, завышенную от ресурса макета.

+0

Итак, 'View', завышенный от' R.layout.toast', установлен как дочерний элемент просмотра контента? если да, то почему он не появляется, как только он завышен? – q126y

+1

@ q126y вы не вызываете метод ... –

+0

@ cricket_007 Я вызываю метод при нажатии кнопки. Я говорю, что если «Просмотр» завышен с «R.layout.toast» установлен как дочерний элемент root 'View' активности, почему он не появляется, как только он завышен? Я попытался установить '.setVisibility (View.VISIBLE)' на завышенном виде. – q126y

1

Вид корня в деятельности определяется по setContentView(int layoutId) или setContentView(View rootView).

В вашем случае, это

setContentView(R.layout.activity_main); 

Таким образом, любой звонок Вы внести findViewById будет искать идентификатор из activity_main.xml.

Если вы не можете найти указанный вами идентификатор, он вернет null.


Следует отметить, что вы не называете этот метод, и это типично, как делается тост.

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

«Поэтому любой вызов, который вы делаете для findViewById, будет искать идентификатор из Activity_main.xml». --- Но Id, который я занимаюсь серфингом, находится в toast.xml, и это работает. – q126y

+0

В коде, который вы указали, 'findViewById' ** ** вызывается в Activity_main, потому что вы вызываете его из класса Activity (например,' this.findViewById'). Если вы хотите называть его в макете тоста, вам нужно будет сделать 'v.findViewById'. Если он работает по текущему пути, то, я думаю, вы дублировали значение 'R.id' в обоих файлах XML. –

+0

http://pastebin.com/sXrTpDc0 http://pastebin.com/QLbbLUdL Я не дублировал идентификаторы. – q126y