2012-02-01 41 views
7

Tôi muốn sử dụng một Hoạt động chứa nhiều đoạn và điều hướng giữa các đoạn. Ví dụ: trong hoạt động, có chế độ xem danh sách là một đoạn, khi người dùng chọn một mục từ danh sách, chế độ xem sẽ điều hướng đến một phân đoạn khác, Cách này có thể được triển khai như thế nào?Điều hướng giữa các đoạn trong một hoạt động

Tôi biết có một tutorial đẹp trên trang web dành cho nhà phát triển nhưng nó xử lý màn hình máy tính bảng trong đó bố cục hai ngăn với một đoạn danh sách và một đoạn chi tiết hiển thị trong một màn hình. Tôi chỉ muốn điều hướng giữa các mảnh mà không hiển thị hai đoạn trong một màn hình.

Có hướng dẫn nào có thể dạy tôi cách thực hiện không?

+0

Nhưng hướng dẫn đó hoàn toàn hợp lệ nếu bạn chỉ xem bố cục dọc. – Warpzit

+0

@ Warpzit, nhưng hướng dẫn yêu cầu tôi tạo hai hoạt động trong bố cục dọc, mỗi hoạt động cho từng đoạn, phải không? –

Trả lời

11

Tóm lại câu trả lời cho câu hỏi của bạn là để thông báo cho hoạt động lưu trữ của bạn và sau đó có hoạt động lưu trữ thay thế vùng chứa phân đoạn hiện tại của bạn bằng FragmentManager.

Một trong những cách tiếp cận là tạo giao diện trong đoạn đầu tiên của bạn, đăng ký/lắng nghe hoạt động lưu trữ của bạn (thực hiện) với giao diện này và sau đó có FragmentManager của bạn để thay thế nội dung vùng chứa với đoạn thứ hai.

Tôi không chắc chắn về hướng dẫn, nhưng đây là đoạn mã của tôi: Đầu tiên 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; 
}} 

Hoạt động chủ

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

Đây chỉ là một ví dụ về cách bạn muốn thực hiện giao diện, vui lòng dọn dẹp nó một mình. Và xin lưu ý rằng mặc dù điều này là không hiệu quả nếu bạn có rất nhiều mảnh muốn thông báo cho hoạt động chủ của bạn về một cái gì đó. làm như vậy sẽ dẫn bạn thực hiện nhiều người nghe khác nhau đến hoạt động chủ của bạn.

+0

Xin chào, nếu tôi có nhiều đoạn (khoảng 5) muốn thông báo cho hoạt động lưu trữ của tôi, cách triển khai sau đó? –

+0

và Tôi có thể sử dụng onAttach() của đoạn để đặt trên trình lắng nghe trong hoạt động của máy chủ thay vì tập hợp tùy chỉnh của bạn trên phương thức không? –

+1

Vâng, hệ thống thông báo tinh vi nhất trong API Android đang sử dụng BroadcastReceiver. Bạn có thể thay thế giao diện/người nghe java thông thường bằng cách sử dụng lớp này. Đăng ký một người nhận trong hoạt động máy chủ của bạn và từ của bạn cụ thể là năm hoặc nhiều mảnh bạn chỉ có thể gửi phát sóng. Để phân biệt giữa đoạn của bạn, bạn có thể sử dụng Intent được gửi cùng trong phương thức sendBroadcast. Kiểm tra này ra: [BroadcastReceiver] (http://developer.android.com/reference/android/content/BroadcastReceiver.html) và có lẽ google lên cho một số ví dụ, tôi không thể gửi ví dụ của tôi trong ý kiến, cổ vũ. –

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> 

-------------------------------------------- 
Các vấn đề liên quan