Android: получение белого экрана с фрагментом транзакции
Я делаю новостное приложение, в котором у меня есть фрагмент, содержащий все новости в списке, и другой фрагмент, в котором есть список видео. Когда вы касаетесь нового, он вызывает метод из действия с именем openNewsCont, который заменит текущий фрагмент другим.
Проблема, с которой я сталкиваюсь, заключается в том, что когда я вызываю этот метод, я получаю пустой экран, я посмотрел много других кодов, но не смог найти решение для своей проблемы.
Вот метод, который я вызываю из MainActivity.java
public void openNewsCont(String text) {
android.support.v4.app.FragmentManager fm = getSupportFragmentManager();
android.support.v4.app.FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.pager, new NewsContent() );
ft.addToBackStack(null);
ft.commit();
fm.executePendingTransactions();
}
Вот Tab1.java, который содержит новости и вызывает метод из MainActivity.java.
package com.example.link_test;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.LinearLayout;
public class Tab1 extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View android = inflater.inflate(R.layout.tab1, container, false);
LinearLayout newLink = (LinearLayout) android.findViewById(R.id.news1);
newLink.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String text = "Text from fragment";
MainActivity ma = (MainActivity) getActivity();
ma.openNewsCont(text);
}
});
return android;
}
}
А вот фрагмент, который нужно вызвать и показывает пустой экран NewsContent.java
package com.example.link_test;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class NewsContent extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.news_content, container, false);
return view;
}
}
3 ответа
Заменить фрагмент как:
Fragment feeddetailFragment = new FeedDetailFragment();
feedFragment.getFragmentManager().beginTransaction()
.replace(R.id.frame_container, feeddetailFragment,Constant.FRAGMENT_FEEDDETAIL)
.addToBackStack(null)
.commit();
Это будет работать..
Если все еще не работает, попробуйте проверить фрагмент, который вы хотите показать после замены, является ли представление этого фрагмента нулевым или нет
if (view != null) {
ViewGroup parent = (ViewGroup) view.getParent();
if (parent != null)
parent.removeView(view);
}
try {
view = inflater.inflate(R.layout.fragment_business_details,
container, false);
initializeViewObjects();
setListeners();
} catch (InflateException e) {
return view;
}
return view;
}
Я решил проблему, убрав поддержку фрагментов версии 4, поскольку это требуется только моим TabAdapter, но только для фрагментов, представленных на вкладках, таких как новости, видео и т. Д. Из фрагментов, которые не управляются как вкладки, такие как NewsContent.java
Вот как должен был выглядеть мой метод, чтобы открыть другой фрагмент из Tab1.
public void openNewsCont() {
NewsContent nc = new NewsContent();
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.container, nc);
ft.addToBackStack(null);
ft.commit();
}
А вот как должен быть NewsContent:
package com.example.link_test;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class NewsContent extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
final View android = inflater.inflate(R.layout.news_content, container, false);
return android;
}
}
Спасибо Eagle11 за его усилия, чтобы помочь мне с этим непонятным вопросом, на решение которого у меня ушло целое утро. Я надеюсь, что этот ответ поможет другим новичкам, как я.
Вы можете иметь этот код в действии, в котором размещены фрагменты. Он проверяет ваш стек и повторно запускает фрагмент. Это один из способов, которыми я решил решить проблему с моей стороны.
@Override
public void onBackPressed() {
int fragments = getFragmentManager().getBackStackEntryCount();
Toast.makeText(this, String.valueOf(fragments), Toast.LENGTH_LONG).show();
if (fragments == 0) {
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.container, new NewsContent());
fragmentTransaction.commit();
super.onBackPressed();
}
}
Одна очевидная вещь, которая бросается в глаза, это то, что у вас есть ft.addToBackStack(null); дважды. Уверен, он должен быть там только один раз.
Кроме того, я считаю, что вам нужно вызывать fm.executePendingTransactions() непосредственно после ft.commit().