Obter visualização raiz da atividade atual

634

Eu sei como obter a visualização raiz com View.getRootView () . Também posso obter a visualização do onClickevento de um botão em que o argumento é uma Visualização . Mas como posso obter a visualização em uma atividade ?

Lalith
fonte
3
Em atividade, normalmente você informa qual recurso ele deve renderizar setContentView()e a exibição que você forneceu já é a raiz. Se você precisar do identificador dessa exibição, basta colocar um ID no XAML e tudo findViewById()ficará bem.
Xandy
Meu plano é anexar o código dinamicamente. Portanto, se meus usuários usam a API, espero que ele detecte automaticamente as coisas. A solução de Boulder funciona!
Lalith
4
@ xandy: um pequeno erro de digitação: XAML -> XML.
Superjulho

Respostas:

1048

Se você precisar da visualização raiz de sua atividade (para poder adicionar seu conteúdo lá), use

findViewById(android.R.id.content).getRootView()

Também foi relatado que em alguns dispositivos você precisa usar

getWindow().getDecorView().findViewById(android.R.id.content)

em vez de.

Observe que, como o Booger relatou, isso pode estar atrás da barra de navegação (com botão voltar etc.) em alguns dispositivos (mas parece que na maioria dos dispositivos não é).

Se você precisar obter a visão que adicionou à sua atividade usando o setContentView()método, como escreveu pottedmeat, você pode usar

final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
            .findViewById(android.R.id.content)).getChildAt(0);

Mas é melhor apenas definir o ID para essa visualização no layout xml e usar esse ID.

Dmitry Ryadnenko
fonte
194
Na verdade, apenas findViewById (android.R.id.content) está me dando a visão raiz. Se isso não for verdade, em alguns casos, posso obter a visualização raiz a partir do findViewById (android.R.id.content) .getRootView (). Obrigado pela resposta. Onde posso aprender mais sobre o material android.R? Eu não estava ciente disso.
Lalith
4
Você pode verificar aqui, suponho que developer.android.com/reference/android/R.html É apenas uma referência de recursos do Android. Pessoalmente, aprendi sobre android.R.id.content e depois verifiquei os layouts no hierarchyviewer.
Dmitry Ryadnenko
14
Percebi que essa visualização parece incluir a barra de status. Portanto, se você procura a parte visível de sua atividade, use a resposta em @pottedmeat.
Ben Clayton
5
@Lalith, você pode informar quando precisava fazer o findViewById (android.R.id.content) .getRootView ()? Uma regra geral seria realmente útil saber.
batbrat
2
@batbrat eu preciso usar .getRootView () no Android 5.0+ ao usar barra de ação
Morten Holmgaard
264

É isso que eu uso para obter a visualização raiz, conforme encontrada no arquivo XML atribuído a setContentView:

final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
            .findViewById(android.R.id.content)).getChildAt(0);
pottedmeat
fonte
33
Esta resposta deu a visão sem a barra de status - que é o que eu queria. Eu estava procurando a largura + altura do pixel da parte visível da atividade. Este funciona, obrigado!
Ben Clayton
9
Isso exclui o ActionBar!
Wayne
4
Existe uma maneira de incluir o ActionBartambém?
theblang
3
As palavras-chave aqui são "a visualização raiz, conforme encontrada no arquivo XML". Obrigado.
Kacy
3
Essa deve ser a resposta marcada correta. Isto irá colocar o Snackbar dentro de sua atividade (na raiz), que é onde ele deve ser (eu tenho certeza que ninguém quer colocar a sua informação atrás das Nav Botões)
Booger
136

Eu testei isso no Android 4.0.3, apenas:

getWindow().getDecorView().getRootView()

dar a mesma visão do que obtemos

anyview.getRootView();

com.android.internal.policy.impl.PhoneWindow$DecorView@#########

e

getWindow().getDecorView().findViewById(android.R.id.content)

dando filho de sua

android.widget.FrameLayout@#######

Por favor confirme.

Sudar Nimalan
fonte
5
Android2.3.3 parece mesmo
Rux
2
Funciona em 4.3 É a maneira mais fácil e com a menor quantidade de código que encontrei.
Oliver Dixon
10
Melhor se você estiver usando SnackBar
zackygaurav 28/11
getWindow (). getDecorView (). getRootView (). getHeight () retorna a altura da exibição.
vovahost
3
getWindow (). getDecorView (). getRootView () não é recomendado para lanchonetes, sobreporá a barra de navegação do sistema, findViewById (android.R.id.content) será melhor.
precisa saber é o seguinte
31

Obtenha a visualização raiz da atividade atual.

Dentro da nossa atividade, podemos ter uma rootvisão com:

ViewGroup rootView = (ViewGroup) ((ViewGroup) this
            .findViewById(android.R.id.content)).getChildAt(0);

ou

View rootView = getWindow().getDecorView().getRootView();
Jorgesys
fonte
20

No Kotlin, podemos fazê-lo um pouco mais curto:

val rootView = window.decorView.rootView
Artem Botnev
fonte
19

Apenas alguém precisa de uma maneira mais fácil:

O código a seguir fornece uma visão de toda a atividade:

View v1 = getWindow().getDecorView().getRootView();

Para obter uma visão certian da atividade, por exemplo, um imageView dentro da atividade, basta adicionar o ID dessa visão que você deseja obter:

View v1 = getWindow().getDecorView().getRootView().findViewById(R.id.imageView1);

Espero que isso ajude alguém

Salah Klein
fonte
5
Você pode simplesmente acessar findViewById(R.id.imageView1);a atividade se desejar a visualização específica.
Robco
3

anyview.getRootView(); será a maneira mais fácil.

Khemraj
fonte
2

Solução de extensão Kotlin

Use isso para simplificar o acesso em uma atividade. Em seguida, você pode consultar diretamente a rootViewpartir da atividade ou activity.rootViewfora dela:

val Activity.rootView get() = window.decorView.rootView

Se você deseja adicionar o mesmo para Fragmentos para obter consistência, adicione:

val Fragment.rootView get() = view?.rootView
Gibolt
fonte
1

para obter a visualização da atividade atual

em qualquer onClick, obteremos "View view", usando 'view' get the rootView.

Visualizar visualização = view.getRootView ();

e para obter View in fragment

Visualizar visualização = FragmentClass.getView ();

user3509903
fonte
0

se você estiver em uma atividade, suponha que exista apenas uma visualização raiz, é possível obtê-la assim.

ViewGroup viewGroup = (ViewGroup) ((ViewGroup) this
        .findViewById(android.R.id.content)).getChildAt(0);

então você pode transmiti-lo para sua classe real

ou você poderia usar

getWindow().getDecorView();

observe que isso incluirá a visualização da barra de ação, sua visualização está abaixo da visualização da barra de ação

arqueiro han
fonte
Não existe esse método na Activityaula.
Onelaview
window.decorView ou window.decorView como ViewGroup - se você precisar convertê-lo no ViewGroup
Edgar Khimich
0

Para aqueles que estão usando a Biblioteca de Ligação de Dados , para obter a raiz da atividade atual, basta usar:

View rootView = dataBinding.getRoot();

E para os usuários do Kotlin, é ainda mais simples:

val rootView = dataBinding.root
Alex Mamo
fonte
0

Outra solução de extensão Kotlin

Se a visualização da sua atividade for declarada em xml (ex activity_root.xml), abra o xml e atribua um ID à visualização raiz:

android:id="@+id/root_activity"

Agora em sua classe, importe a visualização usando:

import kotlinx.android.synthetic.main.activity_root.root_activity

Agora você pode usar root_activitycomo a exibição.

smac89
fonte