7

Я хотел бы использовать одно действие, которое содержит несколько фрагментов и перемещается между фрагментами. Например, в действии есть вид списка, который является фрагментом, когда пользователь выбирает один элемент из списка, представление будет перемещаться к другому фрагменту. Как это можно реализовать?Перемещение между фрагментами за одну активность

Я знаю, что на сайте разработчика есть хороший tutorial, но он обрабатывает экран планшета, в котором два макета панели с одним фрагментом списка и одним подробным фрагментом, отображаемым на одном экране. Я просто хочу перемещаться между фрагментами без отображения двух фрагментов на одном экране.

Есть ли учебники, которые могут научить меня, как это сделать?

+0

Но это учебное пособие совершенно справедливо, если вы только посмотрите на макет портрета. – Warpzit

+0

@ Warpzit, но учебник попросит меня создать два действия в макете портрета, каждый для каждого фрагмента, не так ли? –

ответ

11

В двух словах ответ на ваш вопрос заключается в том, чтобы уведомить об активности вашего хоста, а затем выполнить операцию вашего хоста, заменив ваш текущий контейнер с помощью FragmentManager.

Один из подходов состоит в том, чтобы сделать интерфейс в вашем первом фрагменте, зарегистрировать/прослушать (реализовать) ваш хост-активность в этом интерфейсе, а затем заставить FragmentManager заменить содержимое контейнера вторым фрагментом на обратном вызове слушателя.

Я не уверен, что учебник, но вот мой отрывок: Первый фрагмент

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; 
}} 

Хост активность

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 
}} 

Это всего лишь пример того, как вы бы реализовать интерфейс, любезно убирать его самостоятельно. И, пожалуйста, обратите внимание, что это неэффективно, если у вас есть много фрагментов, которые хотят уведомить вашу активность о чем-то. это приведет к тому, что вы будете внедрять различного слушателя в свою деятельность.

+0

Привет, если у меня много фрагментов (около 5), вы хотите уведомить мою активность о хостинге, как реализовать это? –

+0

и могу ли я использовать функцию onAttach() для установки на слушателе в активности хоста вместо вашего пользовательского набора по методу? –

+1

Ну, самая сложная система уведомлений в Android API использует BroadcastReceiver. Вы можете заменить обычный java-интерфейс/прослушиватель, используя этот класс. Зарегистрируйте получателя в своей активности хоста, и из ваших пяти или более фрагментов вы можете просто отправить широковещательную рассылку. Чтобы различать ваш фрагмент, вы можете использовать Intent, который отправляется в методе sendBroadcast. Проверьте это: [BroadcastReceiver] (http://developer.android.com/reference/android/content/BroadcastReceiver.html) и, вероятно, google для некоторого примера, я не могу опубликовать свой пример в комментариях, приветствиях. –

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> 

-------------------------------------------- 
Смежные вопросы