2011-10-23 49 views
8

Tôi muốn triển khai thiết kế nhiều phần hoạt động một lần trong ứng dụng của mình. Tôi có kế hoạch để có một số "màn hình" (bố trí của Fragment) mà tôi sẽ chuyển đổi giữa (có thể thêm vào back-stack) trong mã.Android - Thay đổi bố cục đoạn trong thời gian chạy

Để hiểu biết bố cục của các đoạn trong mỗi màn hình được đặt bằng cách sử dụng đối tượng Bố cục (ví dụ: FrameLayout), hoạt động như trình giữ chỗ cho các đoạn (chia sẻ cùng một ID). Vì các màn hình khác nhau có các sắp xếp Fragment khác nhau (một khung có thể là FrameLayout và một LinearLayout khác, vv) Tôi đã tự hỏi: Làm cách nào để chuyển đổi giữa các bố cục của các đoạn trong thời gian chạy?

Tôi hiểu việc thêm/thay thế Fragments (thông qua FragmentManager), nhưng tôi muốn thêm hoàn toàn bố cục mới chứa chúng trong một hoạt động trực tiếp. Loại giống như có giao dịch cho "setContentView" ...

Làm cách nào để thực hiện việc này? Cảm ơn! Danny.

+0

Tôi đã đăng mã nhiều đoạn hoạt động đơn lẻ tại đây: http://stackoverflow.com/questions/7797389/how-avoid-re-initializing-activity-that-takes-a-long-time-to-initilize/ 7799391 # 7799391 – user999717

+0

Cảm ơn bạn đã phản hồi nhanh. Tuy nhiên, tôi nghĩ rằng chuyển đổi giữa các đoạn trong cùng một bố cục như ví dụ của bạn cho thấy ('R.id.mainframe'), không giải quyết được vấn đề của tôi, đó là cách chuyển đổi giữa các bố cục của các đoạn. Đặc biệt nếu các bố trí được tạo ra trong mã (sau khi onContentView được gọi), giống như trường hợp của tôi. – DannyA

+0

Ồ, tôi thấy, vì vậy bạn muốn tái bố trí các mảnh hiện có mà không cần tái tạo lại chúng? Nó thật thú vị. – user999717

Trả lời

4

Chắc chắn có thể, điều duy nhất bạn cần làm là tạo ID của riêng bạn. Các ID có thể là bất kỳ điều gì nhưng chúng không được xung đột với các ID aapt (các ID trong R) và không được âm.

Ví dụ sau đây chứng tỏ điều này với một bộ ID cố định:

public class MainActivity extends Activity { 
    private final int ID_TABLE = 0xA; 
    private final int ID_ROW1 = 0xB; 
    private final int ID_ROW2 = 0xC; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     LinearLayout ll = (LinearLayout) findViewById(R.id.root); 
     TableLayout tl = new TableLayout(this); 
     tl.setId(ID_TABLE); 
     TableRow tr1 = new TableRow(this); 
     tr1.setId(ID_ROW1); 
     TableRow tr2 = new TableRow(this); 
     tr2.setId(ID_ROW2); 
     tl.addView(tr1); 
     tl.addView(tr2); 
     ll.addView(tl); 

     MyFragment frag1 = new MyFragment(); 
     MyFragment frag2 = new MyFragment(); 
     MyFragment frag3 = new MyFragment(); 
     MyFragment frag4 = new MyFragment(); 

     getFragmentManager().beginTransaction() 
      .add(ID_ROW1, frag1, "cell1_1") 
      .add(ID_ROW1, frag2, "cell1_2") 
      .add(ID_ROW2, frag3, "cell2_1") 
      .add(ID_ROW2, frag4, "cell2_2") 
      .commit(); 
     getFragmentManager().executePendingTransactions(); 
    } 
} 

Để chuyển sang một bố cục khác nhau, bạn có thể loại bỏ các mảnh vỡ và thêm chúng ở nơi khác.
Hãy cho tôi biết cách thực hiện.

EDIT: để làm rõ, Chế độ xem và Chế độ xem không cần phải được khởi tạo một lần và sau đó được lưu giữ trong suốt thời gian của Hoạt động. Chỉ cần đảm bảo bất kỳ đoạn nào được xóa hoặc tách ra trước khi xóa chế độ xem được liên kết của chúng. Ngoài ra, nếu bạn tạo và xóa các chế độ xem bên ngoài onCreate, bạn phải đảm bảo rằng nó có thể được khôi phục bằng cách sử dụng onSaveInstanceState và lặp lại quy trình trong onCreate. Đọc số diagram here và đoạn khoảng configuration changes.

+0

Cảm ơn bạn đã nỗ lực! Vì tôi là người mới sử dụng Android, tôi muốn chắc chắn rằng tôi đã hiểu bạn chính xác - có thể thêm/xóa chế độ xem và bố cục từ chế độ xem chính của hoạt động của tôi ở bất kỳ nơi nào trong mã của tôi hay không chỉ trong onCreate (I không nghĩ rằng tôi đã nhìn thấy ví dụ cho điều này), và sau đó tạo và thêm các mảnh vỡ cho họ trên bay? Đó là một chút nhiều hơn là chỉ "loại bỏ các mảnh và thêm chúng ở nơi khác", bởi vì tôi tạo ra một bố cục mới cho chúng. – DannyA

+0

Mục tiêu cuối cùng là phân tách lôgic Fragment này thành các lớp "màn hình" khác nhau và yêu cầu mỗi lớp biết về các ID bố cục riêng của nó và đặt các phân đoạn riêng của chúng vào chúng. Sau đó, tôi có thể điều hướng từ một "màn hình" sang một màn hình khác thông qua các giao dịch phân đoạn. ví dụ. ẩn tất cả các mảnh của màn hình trước đó và hiển thị các đoạn mới thay thế. Tôi phải thừa nhận, kỹ thuật này có vẻ hơi kỳ lạ, vì nó sẽ làm ngập hoạt động của tôi với những bố trí trống rỗng với những mảnh vô hình ... Có vẻ như mục tiêu của tôi là hợp lý nhưng tôi không tìm được thiết kế chính xác cho nó. – DannyA

+0

Vâng, đó là một chuyến tàu tư tưởng thú vị, nhưng đây không phải là chính xác những hoạt động nào và phương thức startActivity (Intent) của họ được tạo ra? Bạn cũng nhận được chức năng nút quay lại miễn phí. – user999717

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