2011-07-13 25 views
20

Hãy xem xét các ứng dụng mẫu từ developers.android.comMảnh vỡ - Bạn có phải sử dụng Trình bao bọc hoạt động xung quanh một đoạn bao gồm toàn bộ Hoạt động không?

này mô tả sử dụng mảnh vỡ như vậy:

  • Trên điện thoại, bạn có thể sử dụng Fragment 1 trên Hoạt động A và đoạn 2 trên Hoạt động B.
  • Trên máy tính bảng bạn có nhiều bất động sản hơn để bạn sử dụng Phân đoạn 1 và Đoạn 2 trên Hoạt động A.

Tuyệt vời! ... Nhưng ... Trên ví dụ đầu tiên (ví dụ với điện thoại) bạn tạo một Hoạt động với một tệp xml có chứa một đơn <fragment> và đó là tất cả, trong hoạt động bạn chỉ gọi setContentView() trên xml đó? Điều đó có vẻ như rất nhiều mã dự phòng (Hoạt động, XML & Phân đoạn để hiển thị Phân đoạn): Bạn có thể đặt Fragment làm Activity hoặc là Trình bao bọc với XML luôn được yêu cầu không?

Trả lời

34

Ah, thấy nó here

public class MainMenuHolder extends FragmentActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     // If not already added to the Fragment manager add it. If you don't do this a new Fragment will be added every time this method is called (Such as on orientation change) 
     if(savedInstanceState == null) 
      getSupportFragmentManager().beginTransaction().add(android.R.id.content, new MainMenuFragment()).commit(); 
    } 
} 

FragmentActivity cho phép của bạn để thiết lập các Fragment như nội dung của android.R.id.content mà tôi giả định là android ID nội bộ của quan điểm thân cây.

Với phương pháp này, bạn vẫn kết thúc với một hoạt động chủ yếu là dự phòng (Nếu tất cả những gì bạn muốn là Phân đoạn hoạt động dưới dạng Hoạt động). Nhưng vẫn còn, một nửa như nhiều fluff như có một hoạt động và một tập tin XML hoạt động như một container.

Bất kỳ câu trả lời nào khác sẽ được đánh giá cao!

+1

dùng giải pháp của bạn một bước tiến hơn tạo chung 'SingleFragmentActivity' có một đoạn như tham số hàm tạo và thêm nó vào' onCreate'. sau đó sử dụng Hoạt động này mỗi khi bạn cần một số hoạt động phân đoạn đơn lẻ. – shem

+2

@shem - Tôi thực hiện chính xác điều tương tự - tôi chuyển tên Phân đoạn mẫu thành Hành động để nó có thể được khởi tạo từ Chuỗi. – Graeme

+0

Vâng, bạn cũng có thể ngừng sử dụng Phân đoạn trừ khi bạn thực sự cần. Trong hầu hết các trường hợp, sử dụng một Activity đơn giản cũng sẽ thực hiện công việc cũng như –

2

Ví dụ trực tuyến không điền vào tất cả các khoảng trống. Tôi sẽ cố gắng trả lời câu hỏi của bạn trực tiếp:

"Trên ví dụ đầu tiên (ví dụ có điện thoại) bạn nên tạo Hoạt động với tệp xml chứa một tệp và hoạt động chỉ gọi setContentView() trên xml đó và đó là tất cả?"

Bạn đã bắt đầu ở đúng nơi. Nhưng có nhiều hơn thế. Luôn có nhiều cách để giải quyết vấn đề trong Android nhưng cách được đề xuất để tạo hiệu ứng có số lượng phân đoạn động dựa trên lịch phát sóng. bất động sản là:

  1. Tạo file layout XML trong/bố trí cho tiểu học (mặc định) mục tiêu định hướng/thiết bị/form-factor/SDK
  2. Tạo file XML bố trí cho các cơ sở nhỏ nhất-width cho khác nhắm mục tiêu thiết bị. Bạn cũng có thể muốn nhắm mục tiêu các định hướng khác, SDK, v.v.
  3. Mỗi tệp XML bố cục sẽ có tập hợp các đoạn được xác định riêng của mình
  4. Trong Hoạt động, hãy kiểm tra xem có phân đoạn nào.

Rõ ràng một chiến lược tương tự có thể được áp dụng cho các bố cục có lập trình.

Trong ví dụ của bạn trong câu hỏi ban đầu (từ tài liệu của Google), bạn có thể có:

  • bố trí/main.xml :: bố trí này sẽ chỉ có Fragment 1
  • bố trí sw600dp/main.xml :: bố trí này sẽ phải mảnh vỡ 1, 2

Sau đó, trong MainActivity.java bạn sẽ kiểm tra sự tồn tại của mỗi đoạn . Để làm điều đó, bạn có thể sử dụng FragmentManager # findFragmentById() để có một kiểm tra như: if findFragmentById() trả về null cho Fragment-2 sau đó MainActivity biết thiết bị đã nạp layout/main.xml và chỉ hỗ trợ một đoạn.

Bước 'lùi lại' từ ví dụ này phần nào cho thấy: trước khi sử dụng Phân đoạn bạn có thể đã gọi Hoạt động B từ Hoạt động A với startAcitityForResult (int). Trong mô hình Fragment, bạn có thể chỉ cần có kết quả từ Fragment 2 gây ra một cái gì đó xảy ra trong Fragment 1, vì vậy nó hợp lý để MainActivity là gatekeeper cho điều đó. Khi bạn mở rộng trên ví dụ, bạn có thể thấy rằng trong các ứng dụng khác, MainActivity có thể cần phải gọi các hoạt động khác - vì bất kỳ lý do gì. Có lẽ bạn đang nhắm mục tiêu một máy tính bảng lớn với đủ bất động sản cho 3 mảnh nhưng trên một chiếc điện thoại cần phải có 3 hoạt động. Mọi thứ có thể thú vị nhưng API Fragment khá mạnh mẽ.

"Bạn có thể đặt Phân đoạn làm hoạt động hoặc là Trình bao bọc luôn được yêu cầu khi sử dụng phân đoạn không?"

Phân đoạn không phải là Hoạt động. Thật vậy Fragments được nạp bởi các hoạt động, do đó, có ai có thể nói một wrapper là luôn luôn cần thiết. Bạn đang chạm vào một khía cạnh tinh tế khác của Fragments. Trong khi các hoạt động hoạt động như bộ điều khiển MVC, các mảnh vỡ có thể được gọi là "bộ điều khiển mini" do vòng đời của chúng giống nhau và thực hiện cùng với một hoạt động. Một lần nữa, vòng đời của Fragment được chứa bên trong ("được bao bọc bởi") vòng đời của Activity quản lý Fragment. Tôi khuyên bạn nên làm quen với vòng đời Fragment được ghi lại tại http://developer.android.com/guide/topics/fundamentals/fragments.html#Lifecycle.

+10

Tôi không biết bạn đang trả lời gì ở đây ...? – Graeme

1

More quát bạn có thể tạo ra một lớp chứa đoạn:

public class SingleFragmentActivity extends Activity { 

    public static final String FRAGMENT_NAME = "fragmentName"; 
    public static final String FRAGMENT_ARGUMENTS = "fragmentArguments"; 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     String fragmentName = getIntent().getStringExtra(FRAGMENT_NAME); 
     Fragment fragment = Fragment.instantiate(this, fragmentName); 
     Bundle fragmentArguments = getIntent().getBundleExtra(FRAGMENT_ARGUMENTS); 
     fragment.setArguments(fragmentArguments); 
     getSupportFragmentManager().beginTransaction().replace(android.R.id.content,fragment, "tag").commit(); 
    } 
} 

bây giờ bạn sử dụng lớp này để nhanh chóng bất kỳ mảnh như một hoạt động độc lập:

public void showFragmentAsActivity() { 
    Intent intent = new Intent(this, SingleFragmentActivity.class); 
    intent.putExtra(SingleFragmentActivity.FRAGMENT_NAME, MyFragment.class.getName()); 
    intent.putExtra(SingleFragmentActivity.FRAGMENT_ARGUMENTS,MyFragment.getArgumentsBundle("a string argument")); 
    startActivity(intent); 
} 
Các vấn đề liên quan