Como adicionar programaticamente modos de exibição a modos de exibição
179
Digamos que eu tenho um LinearLayoute quero adicionar um modo de exibição no meu programa a partir do código Java. Que método é usado para isso? Não estou perguntando como isso é feito em XML, o que eu sei, mas como posso fazer algo ao longo desse código de exemplo?
Ligar addViewé a resposta correta, mas você precisa fazer um pouco mais do que isso para fazê-lo funcionar.
Se você criar uma View através de um construtor (por exemplo, Button myButton = new Button();), precisará acessar setLayoutParamsa visualização recém-construída, passando uma instância da classe interna LayoutParams da visualização pai, antes de adicionar seu filho recém-construído à visualização pai.
Por exemplo, você pode ter o seguinte código em sua onCreate()função, assumindo que seu LinearLayout possui o ID R.id.main:
Certifique-se de definir o LayoutParams é importante. Toda visualização precisa de pelo menos um parâmetro layout_width e layout_height. Também é importante obter a classe interna certa. Eu lutei para obter Views adicionadas a um TableRow para exibir corretamente até descobrir que não estava passando uma instância de TableRow.LayoutParams para setLayoutParams da exibição filho.
Como você criaria a exibição programaticamente, mas usando um arquivo de layout XML que você escreveu especificamente para essa nova exibição?
SK9
9
@ SK9 Você usaria um LayoutInflater, que você pode obter de um Contexto, geralmente a Atividade atual. Algo como: LayoutInflater myInflater = getLayoutInflater; Veja myView = myInflater.inflate (R.layout.myLayout, pai, falso);
Brian Cooley
1
Na verdade, getLayoutInflater () vem da classe Window (não Context) e é um método de conveniência em Activity.
Brian Cooley
2
Como prática de codificação, em findViewById, transmita para ViewGroup ou sempre a forma mais genérica de um objeto, para que, se ele mudar de um LinearLayout para um RelativeLayout, você não tenha refatoração.
Joel Teply
1
Estes são alguns detalhes: D
Vivek Solanki
51
para quem ainda estiver interessado:
a melhor maneira que encontrei é usar o método estático inflável do View.
observe que você precisa de um ViewGroup para adicionar uma visualização (que é qualquer layout que você possa imaginar)
Assim, como exemplo, digamos que você tenha um fragmento que a visualização já foi inflada e saiba que a visualização raiz é um layout e deseja adicionar uma visualização:
View view = getView();// returns base view of the fragmentif(view ==null)return;if(!(view instanceofViewGroup))return;ViewGroup viewGroup =(ViewGroup) view;View popup =View.inflate(viewGroup.getContext(), R.layout.someView, viewGroup);
Você também pode escrever um método estático, algo assim addView(View v){ // your code after get view }seria uma visão encontrada usando findViewById(int resourceID)ou inflada como a sua inflatedView... apenas para expandir seu exemplo de fragmento.
Zgc7009 09/10
22
Isso é tarde, mas isso pode ajudar alguém :) :) Para adicionar a exibição programaticamente, tente como
Isso criará toda a sua exibição programaticamente. Você pode adicionar qualquer número de visualizações da mesma forma. Espero que isso possa ajudar. :)
A ideia de definir restrições programaticamente pode ser cansativa. Esta solução abaixo funcionará para qualquer layout, seja de restrição, linear, etc. Ter.
Tudo o que você precisa fazer é aumentar a exibição de forma programática e, quando criança, para o FrameLayout usando o addChild()método Então, durante o tempo de execução, sua visualização seria inflada e colocada na posição correta. Por recomendação do Android, você deve adicionar apenas um childView ao FrameLayout [link] .
Aqui está a aparência do seu código, supondo que você deseje criar o TextView programaticamente em uma posição específica:
Passo 1:
No layout que conteria a vista a ser inflada, coloque um FrameLayout na posição correta e dê um ID, por exemplo, "container".
Etapa 2
Crie um layout com elemento raiz como a visualização que você deseja aumentar durante o tempo de execução, chame o arquivo de layout como "textview.xml":
BTW, defina os parâmetros de layout do seu frameLayout como wrap_content, sempre o layout do quadro se tornará tão grande quanto o pai, ou seja, a atividade, ou seja, a tela do telefone.
Se não estiver definido, porque uma visualização filho do quadro, por padrão, vai para a parte superior esquerda do layout do quadro, portanto, sua visualização simplesmente voará para a parte superior esquerda da tela.
(Nota que a criação último parâmetro findViewByIdpara nulle adicionando vista chamando addView()em vista recipiente (FrameLayout) é o mesmo que simplesmente unindo a visão inflada pela passagem trueem terceiro parâmetro findViewById(). Para mais, veja este .)
Vocês também devem se certificar de que, quando você substituir, onLayoutTEM DE telefonar super.onLayoutcom todas as propriedades, ou a visualização não será inflada!
para quem ainda estiver interessado:
a melhor maneira que encontrei é usar o método estático inflável do View.
onde yourViewXML é algo como R.layout.myView
observe que você precisa de um ViewGroup para adicionar uma visualização (que é qualquer layout que você possa imaginar)
Assim, como exemplo, digamos que você tenha um fragmento que a visualização já foi inflada e saiba que a visualização raiz é um layout e deseja adicionar uma visualização:
fonte
addView(View v){ // your code after get view }
seria uma visão encontrada usandofindViewById(int resourceID)
ou inflada como a suainflatedView
... apenas para expandir seu exemplo de fragmento.Isso é tarde, mas isso pode ajudar alguém :) :) Para adicionar a exibição programaticamente, tente como
Isso criará toda a sua exibição programaticamente. Você pode adicionar qualquer número de visualizações da mesma forma. Espero que isso possa ajudar. :)
fonte
LinearLayout é uma subclasse de ViewGroup , que possui um método chamado addView . O método addView deve ser o que você procura .
fonte
Mais uma maneira de adicionar a visualização da Atividade
fonte
A ideia de definir restrições programaticamente pode ser cansativa. Esta solução abaixo funcionará para qualquer layout, seja de restrição, linear, etc. Ter.
Tudo o que você precisa fazer é aumentar a exibição de forma programática e, quando criança, para o FrameLayout usando o
addChild()
método Então, durante o tempo de execução, sua visualização seria inflada e colocada na posição correta. Por recomendação do Android, você deve adicionar apenas um childView ao FrameLayout [link] .Aqui está a aparência do seu código, supondo que você deseje criar o TextView programaticamente em uma posição específica:
Passo 1:
No layout que conteria a vista a ser inflada, coloque um FrameLayout na posição correta e dê um ID, por exemplo, "container".
Etapa 2 Crie um layout com elemento raiz como a visualização que você deseja aumentar durante o tempo de execução, chame o arquivo de layout como "textview.xml":
BTW, defina os parâmetros de layout do seu frameLayout como wrap_content, sempre o layout do quadro se tornará tão grande quanto o pai, ou seja, a atividade, ou seja, a tela do telefone.
Se não estiver definido, porque uma visualização filho do quadro, por padrão, vai para a parte superior esquerda do layout do quadro, portanto, sua visualização simplesmente voará para a parte superior esquerda da tela.
etapa 3
No seu método oncreate, faça o seguinte:
(Nota que a criação último parâmetro
findViewById
paranull
e adicionando vista chamandoaddView()
em vista recipiente (FrameLayout) é o mesmo que simplesmente unindo a visão inflada pela passagemtrue
em terceiro parâmetrofindViewById()
. Para mais, veja este .)fonte
Vocês também devem se certificar de que, quando você substituir,
onLayout
TEM DE telefonarsuper.onLayout
com todas as propriedades, ou a visualização não será inflada!fonte