2011-10-17 10 views
14

Mam prostą aplikację, która ma dwa fragmenty, a gdy w trybie poziomym oba fragmenty są wyświetlane obok siebie, w widoku portretowym pokazuję fragment A, a jeśli wybiorą opcję, rozpocznij działanie, które pokazuje fragment B. Mój problem polega na tym, że jestem w trybie portretu i pokazuję fragment B, jeśli użytkownik wybierze opcję menu Chcę odświeżyć lub przerysować widok powiązany z fragmentem B i nie może zrozumieć, jak to zrobić. Próbowałem metody getView i getLayoutInflater, ale ekran się nie zmienia, ponieważ myślę, że tworzę nowy widok. Próbowałem również uzyskać odniesienie do Fragmentu A, myśląc, że mógłbym nazwać jego rutynę, aby zbudować nowy fragment i zastąpić Fragment B, ale nie mogę uzyskać odniesienia do niego, ponieważ nie jest on wyświetlany. To, co naprawdę muszę zrobić, to po prostu wymusić wywołanie metody onCreateView w celu nadmuchania nowego widoku, ale wypróbowałem kilka metod, aby spróbować tego dokonać, ale nie mogę ponownie wywołać metody onCreateView. Wszelkie przemyślenia na ten temat?Android Force Fragment do przebudowania View

Odpowiedz

1

jeśli użytkownik wybierze opcję menu Chcę odświeżyć lub przerysować widoku, który jest skojarzony z fragmentem B i nie mogę zrozumieć, jak do tej pracy

W onOptionsItemSelected() mają połączenie aktywności metoda na fragmencie, która powoduje, że aktualizuje swoje widżety nową treścią. Lub, aby działanie zostało wykonane, wykonaj FragmentTransaction, aby zastąpić fragment (jeśli fragment został pierwotnie skonfigurowany za pomocą FragmentTransaction).

9

Będziemy chcieli, aby wykonać FragmentTransaction i użyć metody

To nie powinno być zbyt trudne do zrobienia replace(), ale odpowiedź będzie zależeć od tego, gdzie znajduje się menu (to jest wezwanie onOptionsItemSelected() powrotem wewnątrz rodzic Aktywność czy jest to fragment A/B?).

Załóżmy, ze względu na prostotę, implementacja menu i onOptionsItemSelected() znajduje się w działaniu nadrzędnym, a chcesz zmienić kształt fragmentów w przypadku wybrania opcji menu_opcja1. to będzie wyglądać mniej więcej tak:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
// Handle item selection 
//... 
switch (item.getItemId()) { 
case R.id.menu_option1: 
    //do something 
    FragmentManager fragmentManager = getFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    Fragment newFragment = new YourFragmentClass(); 
    FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
    transaction.replace(R.id.your_fragment_id, newFragment); 
    transaction.addToBackStack(null); 
    transaction.commit(); 
    return true; 
case R.id.menu_option2: 
    //do something else; 
    return true; 
default: 
    return super.onOptionsItemSelected(item); 
} 
} 

Alternatywnie, jeśli menu jest dzieckiem jednego z fragmentów (co powinno być dla dobra więcej kodu wielokrotnego użytku), a następnie jedną z metod jest wymóg, że aktywność hosta do implementacji interfejsu zdefiniowanego przez Fragment, który może być użyty jako oddzwonienie. I w oddzwanianiu onOptionsItemSelected() wewnątrz klasy fragmentu, wystarczy wykonać wywołanie tej metody wywołania zwrotnego.

Chociaż brzmi to jak kęs, naprawdę trzeba zrobić tylko kilka rzeczy. Udawać, że jest to klasa Fragment

public static class FragmentA extends ListFragment { 
OnSelectedListener mListener; 
// Container Activity must implement this interface 
public interface OnSelectedListener { 
    public void onSelected(); 
} 
... 
@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    //This is to ensure that the Activity has implemented the interface we set up above 
    try { 
     mListener = (OnSelectedListener) activity; 
    } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() + " must implement OnSelectedListener"); 
    } 
} 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
// Handle item selection 
//... 
switch (item.getItemId()) { 
case R.id.menu_option1: 
    //do something 
    getActivity().onSelected(); 
    return true; 
case R.id.menu_option2: 
    //do something else; 
    return true; 
default: 
    return super.onOptionsItemSelected(item); 
} 
} 
... 
} 

Następnie w działalności, będzie można zobaczyć coś takiego:

public class MainActivity extends Activity implements FragmentA.onSelectedListener{ 
... 
public void onSelected(){ 
    FragmentManager fragmentManager = getFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    Fragment newFragment = new YourFragmentClass(); 
    FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
    transaction.replace(R.id.your_fragment_id, newFragment); 
    transaction.addToBackStack(null); 
    transaction.commit(); 
} 
} 
+7

Kiedy wymieniasz R.id.your_fragment_id, jesteś przy założeniu, że został ogłoszony w XML . Ale co, jeśli mój pierwotny fragment został skonstruowany programowo? –

+1

@IgorGanapolsky to będzie identyfikator kontenera tego fragmentu – dmSherazi

Powiązane problemy