Em um aplicativo Android, estou carregando dados de um Db em um TableView
dentro de a Fragment
. Mas quando eu recarrego o Fragment
ele exibe os dados anteriores. Posso preencher novamente o Fragment
com dados atuais em vez de dados anteriores?
Em um aplicativo Android, estou carregando dados de um Db em um TableView
dentro de a Fragment
. Mas quando eu recarrego o Fragment
ele exibe os dados anteriores. Posso preencher novamente o Fragment
com dados atuais em vez de dados anteriores?
Respostas:
Eu acho que você deseja atualizar o conteúdo do fragmento na atualização do banco de dados
Em caso afirmativo, destaque o fragmento e reconecte-o
// Reload current fragment
Fragment frg = null;
frg = getSupportFragmentManager().findFragmentByTag("Your_Fragment_TAG");
final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.detach(frg);
ft.attach(frg);
ft.commit();
Your_Fragment_TAG é o nome que você deu ao seu fragmento quando o criou
Este código é para a biblioteca de suporte.
Se você não oferece suporte a dispositivos mais antigos, basta usar getFragmentManager em vez de getSupportFragmentManager
[EDITAR]
Este método requer que o Fragment tenha uma tag.
Caso você não o tenha, o método de @Hammer é o que você precisa.
Isso irá atualizar o fragmento atual:
FragmentTransaction ft = getFragmentManager().beginTransaction();
if (Build.VERSION.SDK_INT >= 26) {
ft.setReorderingAllowed(false);
}
ft.detach(this).attach(this).commit();
Caso você não tenha a tag de fragmento, o código a seguir funciona bem para mim.
Fragment currentFragment = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);
if (currentFragment instanceof "NAME OF YOUR FRAGMENT CLASS") {
FragmentTransaction fragTransaction = (getActivity()).getFragmentManager().beginTransaction();
fragTransaction.detach(currentFragment);
fragTransaction.attach(currentFragment);
fragTransaction.commit();}
}
getActivity()
na minha atividade. Devo usar Activity.this...
?
você pode atualizar seu fragmento quando estiver visível para o usuário, basta adicionar este código em seu fragmento. Isso irá atualizar seu fragmento quando estiver visível.
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// Refresh your fragment here
getFragmentManager().beginTransaction().detach(this).attach(this).commit();
Log.i("IsRefresh", "Yes");
}
}
Para atualizar o fragmento a resposta aceita não funcionará no Nougat e na versão superior. Para fazer funcionar em todos os sistemas operacionais, você pode fazer o seguinte.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
fragmentManager.beginTransaction().detach(this).commitNow();
fragmentManager.beginTransaction().attach(this).commitNow();
} else {
fragmentManager.beginTransaction().detach(this).attach(this).commit();
}
Você não pode recarregar o fragmento enquanto ele estiver anexado a uma atividade, onde você obtém a Fragment Already Added
exceção " ".
Portanto, o fragmento deve ser primeiro destacado de sua atividade e depois anexado. Tudo pode ser feito usando a API fluente em uma linha:
getFragmentManager().beginTransaction().detach(this).attach(this).commit();
Atualização: para incorporar as alterações feitas na API 26 e superior:
FragmentTransaction transaction = mActivity.getFragmentManager()
.beginTransaction();
if (Build.VERSION.SDK_INT >= 26) {
transaction.setReorderingAllowed(false);
}
transaction.detach(this).attach
(this).commit();
Para obter mais descrições da atualização, consulte https://stackoverflow.com/a/51327440/4514796
MyFragment fragment = (MyFragment) getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG);
getSupportFragmentManager().beginTransaction().detach(fragment).attach(fragment).commit();
isso só funcionará se você usar FragmentManager
para inicializar o fragmento. Se você tiver <fragment ... />
em XML, não chamará de onCreateView
novo. Perdi meus 30 minutos para descobrir isso.
Aqui está o que eu fiz e funcionou para mim, eu uso o firebase e quando o usuário está logado, eu queria atualizar o fragmento atual primeiro, você precisará solicitar o contexto da atividade porque o fragmento não tem uma maneira de obter contexto, a menos que você o defina em Activity ou context aqui é o código que usei e trabalhei na linguagem kotlin, acho que você poderia usar o mesmo na classe java
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
super.setUserVisibleHint(isVisibleToUser)
val context = requireActivity()
if (auth.currentUser != null) {
if (isVisibleToUser){
context.supportFragmentManager.beginTransaction().detach(this).attach(this).commit()
}
}
}
Use um ContentProvider
e carregue seus dados usando um 'CursorLoader'. Com esta arquitetura, seus dados serão recarregados automaticamente nas alterações do banco de dados. Use estruturas de terceiros para o seu ContentProvider
- você realmente não quer implementá-lo sozinho ...
Eu tive o mesmo problema, mas nenhuma das opções acima funcionou para o meu. ou houve um problema de backstack (depois de carregar quando o usuário pressionou de volta, ele iria para o mesmo fragmento novamente) ou ele não chamou oonCreaetView
finalmente eu fiz isso:
public void transactFragment(Fragment fragment, boolean reload) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
if (reload) {
getSupportFragmentManager().popBackStack();
}
transaction.replace(R.id.main_activity_frame_layout, fragment);
transaction.addToBackStack(null);
transaction.commit();
}
bom ponto é que você não precisa da tag ou id do fragmento também. se você quiser recarregar
Faça uso do método onResume ... tanto na atividade do fragmento quanto na atividade que contém o fragmento.
getActivity().getSupportFragmentManager().beginTransaction().replace(GeneralInfo.this.getId(), new GeneralInfo()).commit();
GeneralInfo
é minha aula de fragmento GeneralInfo.java
Eu o coloquei como um método na classe de fragmento:
public void Reload(){
getActivity().getSupportFragmentManager().beginTransaction().replace(LogActivity.this.getId(), new LogActivity()).commit();
}
Por exemplo, com TabLayout: basta implementar OnTabSelectedListener. Para recarregar a página, você pode usar implementar SwipeRefreshLayout.OnRefreshListener iepublic class YourFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener {
o método onRefresh () será @Override da interface, ou seja:
@Override
public void onRefresh() {
loadData();
}
Aqui está o layout:
<com.google.android.material.tabs.TabLayout
android:id="@+id/tablayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimaryLighter"
app:tabGravity="fill"
app:tabIndicatorColor="@color/white"
app:tabMode="fixed"
app:tabSelectedTextColor="@color/colorTextPrimary"
app:tabTextColor="@color/colorTextDisable" />
Código em sua atividade
TabLayout tabLayout = (TabLayout) findViewById (R.id.tablayout); tabLayout.setupWithViewPager (viewPager);
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
if (tab.getPosition() == 0) {
yourFragment1.onRefresh();
} else if (tab.getPosition() == 1) {
yourFragment2.onRefresh();
}
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
Caminho mais fácil
faça um método estático público contendo viewpager.setAdapter
tornar o adaptador e o visualizador estáticos
public static void refreshFragments(){
viewPager.setAdapter(adapter);
}
ligue para qualquer lugar, qualquer atividade, qualquer fragmento.
MainActivity.refreshFragments();