Eu tenho duas aulas Primeiro é a atividade, o segundo é um fragmento onde eu tenho alguns EditText
. Na atividade, tenho uma subclasse com tarefa assíncrona e, no método doInBackground
, obtenho algum resultado, que salvo na variável. Como posso enviar esta variável da subclasse "minha atividade" para este fragmento?
android
android-fragments
user1302569
fonte
fonte
getArguments().getString(key)
Também é possível acessar dados da atividade do fragmento:
Atividade:
Fragmento:
fonte
Bundle
classe para passar informações. Como alternativa, você pode tornar essegetMyData()
método herdado e implementado de uma interface eFragment
verificar se getActivity retorna umainstanceof
interfaceonAttach()
.Encontrei muitas respostas aqui @ stackoverflow.com, mas definitivamente esta é a resposta correta de:
"Enviando dados da atividade para fragmentar no Android".
Atividade:
Fragmento:
Lendo o valor no fragmento
ou apenas
fonte
Esta resposta pode ser tarde demais. mas será útil para futuros leitores.
Eu tenho alguns critérios. Eu codifiquei para escolher o arquivo da intenção. e arquivo selecionado a ser passado para um fragmento específico para posterior processo. Eu tenho muitos fragmentos com a funcionalidade de Seleção de arquivo. no momento, sempre que checar a condição e obter o fragmento e passar o valor, é bastante nojento. então, eu decidi passar o valor usando a interface.
Etapa 1: Crie a interface na Atividade Principal.
Etapa 2: criar a referência SelectedBundle na mesma atividade
Etapa 3: criar o método na mesma atividade
Etapa 4: é necessário inicializar a referência SelectedBundle, que é um fragmento, que precisa da funcionalidade filepicker. Você coloca esse código no
onCreateView(..)
método de fragmentoEtapa 5: meu caso, preciso passar a imagem Uri da HomeActivity para o fragmento. Então, eu usei essa funcionalidade no método onActivityResult.
onActivityResult do MainActivity, passe os valores para os fragmentos usando a interface.
Nota: Seu caso pode ser diferente. você pode chamá-lo de qualquer lugar da sua HomeActivity.
Isso é tudo. Implemente todos os fragmentos necessários na FragmentClass. Você é ótimo. você fez. UAU...
fonte
A idéia básica do uso de fragmentos (F) é criar componentes de interface do usuário auto-sustentáveis reutilizáveis em aplicativos Android. Esses fragmentos estão contidos em atividades e existem maneiras (melhores) comuns de criar caminhos de comunicação de A -> F e FA. É necessário se comunicar entre FF por meio de uma atividade, porque somente os fragmentos se dissociam e se sustentam.
Portanto, passar dados de A -> F será o mesmo que explicado por ρяσѕρєя K. Além dessa resposta, após a criação dos fragmentos dentro de uma atividade, também podemos passar dados para os fragmentos que chamam métodos em Fragmentos.
Por exemplo:
fonte
A abordagem melhor e conveniente é chamar instância de fragmento e enviar dados naquele momento. cada fragmento por padrão tem método de instância
então você chamará seu fragmento de atividade como esta:
* R.id.container é um ID do meu FrameLayout
portanto, em MyFragment.newInstance ("data1", "data2"), você pode enviar dados para fragmentos e, no seu fragmento, obtém esses dados em MyFragment newInstance (String param1, String param2)
e, em seguida, no método de fragmento onCreate , você obterá os dados:
fonte
Gostaria de acrescentar aos iniciantes que a diferença entre as 2 respostas mais votadas aqui é dada pelo uso diferente de um fragmento.
Se você usar o fragmento na classe java em que possui os dados que deseja transmitir, poderá aplicar a primeira resposta para transmitir dados:
Se, no entanto, você usar, por exemplo, o código padrão fornecido pelo Android Studio para fragmentos com guias, esse código não funcionará.
Ele não funcionará mesmo se você substituir o PlaceholderFragment padrão por seu FragmentClasses e mesmo se você corrigir o FragmentPagerAdapter na nova situação, adicionando uma opção para getItem () e outra opção para getPageTitle () (como mostrado aqui )
Aviso: o clipe mencionado acima possui erros de código, que explicarei mais adiante aqui, mas é útil para ver como você passa do código padrão para o código editável para fragmentos com guias)! O restante da minha resposta faz muito mais sentido se você considerar as classes java e os arquivos xml desse clipe (representativo do primeiro uso de fragmentos de guias em um cenário para iniciantes).
O principal motivo pelo qual a resposta mais votada desta página não funcionará é que nesse código padrão para fragmentos com guias, os fragmentos são usados em outra classe java: FragmentPagerAdapter!
Portanto, para enviar os dados, você é tentado a criar um pacote no MotherActivity e passá-lo no FragmentPagerAdapter, usando a resposta no.2.
Só que está errado de novo. ( Provavelmente você poderia fazer assim, mas é apenas uma complicação que não é realmente necessária ).
A maneira correta / mais fácil de fazer isso, eu acho, é passar os dados diretamente para o fragmento em questão, usando a resposta no.2. Sim, haverá um forte acoplamento entre a Atividade e o Fragmento, MAS, para fragmentos com guias, isso é o esperado. Eu aconselho você a criar os fragmentos com guias dentro da classe java MotherActivity (como subclasses, pois nunca serão usados fora da MotherActivity) - é fácil, basta adicionar dentro da classe java MotherActivity quantos fragmentos precisar, como este:
Portanto, para passar dados da MotherActivity para um fragmento, será necessário criar Strings / Bundles particulares acima da atividade onCreate da sua Mãe - que você pode preencher com os dados que deseja passar aos fragmentos e transmiti-los através de um método criado após o onCreate (aqui chamado getMyData ()).
E então na classe fragment, você usa getMyData:
Se você tiver consultas ao banco de dados, aconselho que você as faça no MotherActivity (e transmita seus resultados como Strings / Inteiros anexados a chaves dentro de um pacote, como mostrado acima), como dentro dos fragmentos com guias, sua sintaxe se tornará mais complexa (isso se torna getActivity () por exemplo, e getIntent se torna getActivity (). getIntent), mas você também tem a opção de fazer o que quiser.
Meu conselho para iniciantes é focar em pequenos passos. Primeiro, obtenha sua intenção de abrir uma atividade com guias muito simples, sem passar QUALQUER dado. Funciona? Abre as guias que você espera? Se não, por que?
Comece com isso e, aplicando soluções como as apresentadas neste clipe , veja o que está faltando. Para esse clipe específico, o mainactivity.xml nunca é mostrado. Isso certamente vai confundir você. Mas se você prestar atenção, verá que, por exemplo, o contexto (tools: context) está errado nos arquivos de fragmento xml. Cada XML de fragmento precisa apontar para a classe de fragmento correta (ou subclasse usando o separador $).
Você também verá que na classe java de atividade principal você precisa adicionar tabLayout.setupWithViewPager (mViewPager) - logo após a linha TabLayout tabLayout = (TabLayout) findViewById (R.id.tabs); sem essa linha, sua visualização não está realmente vinculada aos arquivos XML dos fragmentos, mas mostra APENAS o arquivo xml da atividade principal.
Além da linha na classe java de atividade principal, no arquivo XML de atividade principal, você precisa alterar as guias para se adequar à sua situação (por exemplo, adicionar ou remover TabItems). Se você não possui guias no XML da atividade principal, possivelmente não escolheu o tipo de atividade correto quando o criou em primeiro lugar (nova atividade - atividade com guias).
Observe que nos últimos 3 parágrafos eu falo sobre o vídeo! Então, quando digo XML de atividade principal, é o XML de atividade principal no vídeo, que na sua situação é o arquivo XML de MotherActivity.
fonte
Se você passar uma referência ao fragmento (subclasse concreta de) para a tarefa assíncrona, poderá acessar o fragmento diretamente.
Algumas maneiras de passar a referência de fragmento para a tarefa assíncrona:
class FooTask extends AsyncTask
), passe seu fragmento para o construtor.fonte
Às vezes, você pode receber Intent em sua atividade e precisa passar as informações para seu fragmento de trabalho.
As respostas dadas são boas se você precisar iniciar o fragmento, mas se ele ainda
setArguments()
estiver funcionando, não será muito útil.Outro problema ocorre se as informações passadas causarem interação com sua interface do usuário. Nesse caso, você não pode chamar algo assim
myfragment.passData()
porque o Android informa rapidamente que apenas o segmento que criou a exibição pode interagir.Então, minha proposta é usar um receptor. Dessa forma, você pode enviar dados de qualquer lugar, incluindo a atividade, mas o trabalho será realizado no contexto do fragmento.
Nos seus fragmentos
onCreate()
:Na sua atividade:
fonte
Post muito antigo, ainda me atrevo a acrescentar uma pequena explicação que teria sido útil para mim.
Tecnicamente, você pode definir diretamente membros de qualquer tipo em um fragmento da atividade.
Então, por que Bundle?
O motivo é muito simples - o Bundle fornece uma maneira uniforme de lidar com:
- criação / abertura de fragmento
- reconfiguração (rotação da tela) - basta adicionar o pacote inicial / atualizado ao outState em onSaveInstanceState ()
- restauração do aplicativo depois de coletar lixo em segundo plano ( como na reconfiguração).
Você pode (se você gosta de experiências) criar uma solução alternativa em situações simples, mas a abordagem por Bundle simplesmente não vê diferença entre um fragmento e mil em um backstack - permanece simples e direto.
É por isso que a resposta da @Elenasys é a solução mais elegante e universal.
E é por isso que a resposta dada por @Martin tem armadilhas
fonte
a melhor abordagem para enviar dados da classe de atividade para o fragmento é passar por métodos setter. Gostar
e obtenha esses dados da classe facilmente.
fonte
Desde
Activity
que você enviar dados com Bundle como:E no
Fragment
método onCreateView, obtenha os dados:fonte
Se for
activity
necessáriofragment
executar uma ação após a inicialização, a maneira mais fácil éactivity
chamar um método nafragment
instância. Nofragment
, adicione um método:e, em seguida, no
activity
, obtenha acesso aofragment
usando ofragment
gerenciador e chame omethod
:e então o
activity
pode se comunicar diretamente com ofragment
chamando issomethod
.fonte
onCreateView
método no fragmento. foi muito útilUse a interface a seguir para se comunicar entre atividade e fragmento
Ou use o seguinte ouvinte genérico para comunicação bidirecional usando a interface
método de exibição de fragmentos
você pode lançar o seu contexto para
GenericConnector
nosonAttach(Context)
demaisna sua atividade
no seu fragmento
Nota: nunca use da mesma
"".toString().toString().toString();
maneira.fonte
apenas tropeçou nessa questão, enquanto a maioria dos métodos acima funcionará. Quero apenas acrescentar que você pode usar a Biblioteca de Barramento de Eventos , especialmente em cenários em que o componente (Atividade ou Fragmento) não foi criado, o que é bom para todos os tamanhos de projetos Android e para muitos casos de uso. Eu pessoalmente o usei em vários projetos que tenho no playstore.
fonte
Você pode criar um método estático público no fragmento, onde você obterá uma referência estática desse fragmento e passará os dados para essa função, configurando esses dados para o argumento no mesmo método e obtendo dados via getArgument no método oncreate do fragmento, e configurando esses dados para o local variáveis.
fonte
A maneira mais inteligente de testar e testar os dados entre fragmentos e atividade é criar variáveis, por exemplo:
Em seguida, para passar dados de fragmento para atividade, fazemos isso no método onActivityCreated:
Agora você pode obter o valor de StorageUtil.employees de qualquer lugar. Boa sorte!
fonte
Minha solução é escrever um método estático dentro do fragmento:
Dessa forma, tenho certeza de que todos os dados necessários estão dentro do Fragmento antes de qualquer outra operação possível que possa precisar trabalhar com ele. Também parece mais limpo na minha opinião.
fonte
Corri para um problema semelhante ao usar o componente de arquitetura de navegação mais recente. Tentei todo o código acima mencionado ao passar um pacote da minha atividade de chamada para o Fragment.
A melhor solução, seguindo as últimas tendências de desenvolvimento no Android, é usando o View Model (parte do Android Jetpack).
Crie e inicialize uma classe ViewModel na atividade pai. Observe que esse ViewModel deve ser compartilhado entre a atividade e o fragmento.
Agora, dentro do onViewCreated () do fragmento, inicialize o mesmo ViewModel e configure os observadores para ouvir os campos do ViewModel.
Aqui está um tutorial útil e detalhado, se você precisar.
https://medium.com/mindorks/how-to-communicate-between-fragments-and-activity-using-viewmodel-ca733233a51c
fonte
Na sua atividade, declare variável estática
Então no seu fragmento faça o seguinte
fonte