2012-02-01 11 views
7

Chciałbym użyć jednej aktywności, która zawiera kilka fragmentów i porusza się między fragmentami. Na przykład w działaniu istnieje widok listy, który jest fragmentem, gdy użytkownik wybierze jeden element z listy, widok przejdzie do innego fragmentu, w jaki sposób można to zaimplementować?Nawigowanie wśród fragmentów w ramach jednej aktywności

Wiem, że w witrynie dla programistów jest ładny tutorial, ale obsługuje on ekran tabletu, na którym układ dwóch okien z jednym fragmentem listy i jednym szczegółowym fragmentem jest wyświetlany na jednym ekranie. Chcę tylko nawigować wśród fragmentów bez pokazywania dwóch fragmentów na jednym ekranie.

Czy tutoriale mogą mnie nauczyć, jak to zrobić?

+0

Ale ten samouczek jest całkowicie poprawny, jeśli spojrzysz tylko na układ pionowy. – Warpzit

+0

@ Warpzit, ale samouczek poprosił mnie o utworzenie dwóch działań w układzie portretu, z których każdy dla każdego fragmentu, prawda? –

Odpowiedz

11

W skrócie, odpowiedź na twoje pytanie polega na powiadomieniu aktywności hosta, a następnie aktywowaniu hosta przez zastąpienie bieżącego kontenera fragmentu za pomocą FragmentManager.

Jednym z podejść jest utworzenie interfejsu w pierwszym fragmencie, zarejestrowanie aktywności hosta/odsłuchania (narzędzia) w tym interfejsie, a następnie użycie FragmentManager do zastąpienia zawartości kontenera drugim fragmentem wywołania zwrotnego.

nie jestem pewien o tutorialu ale tutaj jest mój urywek: Pierwszy fragment

public class First extends Fragment{ 
private static onMySignalListener listener; 

//call this function from whatever you like i.e button onClickListener 
public void switchWindow() { 
    if(listener != null){ 
     listener.onMySignal(); 
    } 
} 

public interface onMySignalListener { 
    //customize this to your liking 

    //plain without argument 
    void onMySignal(); 

    //with argument 
    void onMySignalWithNum(int mNum); 
} 

public static void setOnMySignalListener(onMySignalListener listener) { 
    First.listener = listener; 
}} 

aktywny Host

public class HostActivity extends FragmentActivity implements onMySignalListener{ 
private final String ADD_TAG_IF_NECESSARY = "mTag"; 

@Override 
public void onCreate(Bundle ssi) { 
    setContentLayout(R.layout.main); 

    FirstFragment.setOnMySignalListener(this); 
} 

@Override 
public void onMySignal() { 
    //if you're using compat library 
    FragmentManager manager = getSupportFragmentManager(); 
    FragmentTransaction transaction = manager.beginTransaction(); 

    //initialize your second fragment 
    sfragment = SecondFragment.newInstance(null); 
    //replace your current container being most of the time as FrameLayout 
    transaction.replace(R.id.container, fragment, ADD_TAG_IF_NECESSARY); 
    transaction.commit(); 
} 

@Override 
public void onMySignalWithNum(int mNum) { 
    //you can do the same like the above probably with your own customization 
}} 

To jest tylko przykładem, w jaki sposób chcesz zaimplementować interfejs, uprzejmie uporządkuj to sam. Należy jednak zauważyć, że nie jest to skuteczne, jeśli masz dużo fragmentów, które chcą powiadomić o czymś na temat działania hosta. spowoduje to zaimplementowanie różnych słuchaczy w aktywności gospodarza.

+0

Witam, jeśli mam dużo fragmentów (około 5) chcę powiadomić moją aktywność hosta, jak zaimplementować? –

+0

i Czy mogę użyć funkcji onAttach() fragmentu do ustawienia na detektorze w działaniu hosta zamiast niestandardowego ustawienia metody? –

+1

Cóż, najbardziej wyrafinowanym systemem powiadamiania w Androidzie API jest użycie BroadcastReceiver. Możesz zastąpić konwencjonalny interfejs/program nasłuchujący java za pomocą tej klasy. Zarejestruj odbiorcę w swojej działalności hosta, a od twoich pięciu lub więcej fragmentów możesz po prostu wysłać transmisję. Aby rozróżnić swój fragment, możesz użyć funkcji Intent, która jest wysyłana w metodzie sendBroadcast. Sprawdź to: [BroadcastReceiver] (http://developer.android.com/reference/android/content/BroadcastReceiver.html) i prawdopodobnie google na przykład, nie mogę opublikować mojego przykładu w komentarzach, okrzyki. –

5
I think this will be useful for you. 

example of two fragments in one screen works independently 
=========================================================== 

public class MainActivity extends Activity { 

    enter code here 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main_activity); 

     Fragment newFragment = new Test(); 
     FragmentTransaction transaction = getFragmentManager() 
       .beginTransaction(); 
     transaction.add(R.id.UprLayout, newFragment); 
//  transaction.addToBackStack(null); 
     transaction.commit(); 

     Fragment newFragment2 = new TestRight(); 
     FragmentTransaction transaction2 = getFragmentManager() 
       .beginTransaction(); 
     transaction2.add(R.id.dwnLayout, newFragment2); 
//  transaction.addToBackStack(null); 
     transaction2.commit(); 


    } 
} 

----------------------------- 
main_activity layout 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/LinearLayout2" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center|center_horizontal" 
    android:orientation="vertical" > 

    <LinearLayout 
     android:id="@+id/UprLayout" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:orientation="vertical" > 

    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/dwnLayout" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:orientation="vertical" > 

    </LinearLayout> 

</LinearLayout> 

------------------------------------ 
public class Test extends Fragment { 
@Override 
    public void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
    } 

TextView tv; 
    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.test, container, false); 
     return view;   
    } 
} 
--------------------------- 

public class TestRight extends Fragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.test_right, container, false); 
     return view; 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 
     Button button = (Button)getActivity().findViewById(R.id.button1); 
     button.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       Fragment newFragment = new Right2nd(); 
       FragmentTransaction transaction = getFragmentManager() 
         .beginTransaction(); 
       transaction.replace(R.id.dwnLayout, newFragment); 
       transaction.addToBackStack("aa"); 
       transaction.commit(); 

//    transaction.add(R.id.frag, newFragment).commit(); 
      } 
     }); 
    } 

} 
------------------------------- 
test layout 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center" 
    android:orientation="vertical" > 
    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center_horizontal" 
     android:text="test" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:textSize="50sp" /> 

</LinearLayout> 
------------------------------------ 
test_right layout 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center" 
    android:orientation="vertical" > 

    <Button 
     android:id="@+id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Click" /> 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Test right" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:textSize="45sp" /> 

</LinearLayout> 
------------------------------------- 
public class Right2nd extends Fragment{ 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View vw= inflater.inflate(R.layout.right_2nd, container, false); 
     return vw; 
    } 
} 
------------------------------------------- 
right_2nd layout 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center" 
    android:orientation="vertical" > 


    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Right 2nd" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:textSize="50sp" /> 

</LinearLayout> 

-------------------------------------------- 
Powiązane problemy