Widziałem sporo pytań na temat SO o Fragments i nadal nie mogę się dowiedzieć, czy to, co chcę zrobić, jest możliwe, a bardziej, jeśli mój projekt Wzór jest po prostu wadliwy i potrzebuję przerobić cały proces. Zasadniczo, podobnie jak większość zadawanych pytań, mam ActionBar z NavigationTabs (przy użyciu ActionBarSherlock), a następnie w każdej karcie znajduje się FragingActivity, a następnie FragmentAktywity przesuwają nowe Fragmenty po wybraniu wiersza (próbuję odtworzyć Projekt iOS na Androida i to tylko podstawowa aplikacja oparta na nawigacjach z kilkoma zakładkami, które mogą drążyć konkretne informacje). Kiedy klikam przycisk powrotu w telefonie, poprzedni Fragment jest ładowany, ale Fragment odtwarza się ponownie (więc WebServices są wywoływane ponownie dla każdego widoku) i nie jest to konieczne, ponieważ informacje nie zmienią się w poprzednim widoku, gdy iść wstecz. Więc w zasadzie to, co chcę wymyślić, to jak skonfigurować moje Fragmenty, aby po naciśnięciu przycisku wstecz na telefonie, poprzedni Fragment został właśnie wyciągnięty z wcześniej utworzonych elementów. Poniżej jest mój bieżący kod:Android Fragment, wracając bez odtwarzania/ponownego ładowania Fragment
//This is from my FragmentActivity Class that contains the ActionBar and Tab Selection Control
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
int selectedTab = tab.getPosition();
if (selectedTab == 0) {
SalesMainScreen salesScreen = new SalesMainScreen();
ft.replace(R.id.content, salesScreen);
}
else if (selectedTab == 1) {
ClientMainScreen clientScreen = new ClientMainScreen();
ft.replace(R.id.content, clientScreen);
}.....
//This is within the ClientMainScreen Fragment Class, which handles moving to the Detail Fragment
row.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Do something if Row is clicked
try{
String selectedClientName = clientObject.getString("ClientName");
String selectedClientID = clientObject.getString("ClientID");
String selectedValue = clientObject.getString("ClientValue");
transaction = getFragmentManager().beginTransaction();
ClientDetailScreen detailScreen = new ClientDetailScreen();
detailScreen.clientID = selectedClientID;
detailScreen.clientName = selectedClientName;
detailScreen.clientValue = selectedValue;
int currentID = ((ViewGroup)getView().getParent()).getId();
transaction.replace(currentID,detailScreen);
transaction.addToBackStack(null);
transaction.commit();
}
catch (Exception e) {
e.printStackTrace();
}
}
});....
//And then this is the Client Detail Fragment, with the method being called to Call the Web Service and create thew (since what is displayed on this screen is dependent on what is found in the Web Service
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle saved) {
return inflater.inflate(R.layout.clientdetailscreen, group, false);
}
@Override
public void onActivityCreated (Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//Setup Preferences File Link
this.preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
//initialize the table object
mainTable = (TableLayout)getActivity().findViewById(R.id.mainTable);
//setup the detail table
setupRelatedClientSection();
}
Ekran Client Szczegóły można następnie drążyć jeszcze raz, przy użyciu tej samej metody co klient ekranu głównego, ale kiedy wrócę z tego nowego ekranu do Szczegółowo Ekran ten seuptRelatedClientSection () Metoda jest wywoływana ponownie, więc cały Fragment jest przebudowywany, gdy naprawdę chcę tylko zapisać zapisaną wersję tego ekranu. Czy to możliwe przy mojej obecnej konfiguracji, czy też podchodziłem do tego w niewłaściwy sposób?
użyłem .add() zamiast .Show(). Z drugiego fragmentu, kiedy nacisnąłem przycisk, przeszedłem do pierwszego fragmentu i nie odświeżałem. – Sri