2011-11-08 30 views
16

Tôi mới phát triển Android và đang bối rối về cách hoàn thành những gì tôi đang cố gắng làm. Tôi đã thực hiện một số đọc và tìm hiểu về các phân đoạn để tôi có thể chia sẻ bố cục và mã giữa các thiết kế kích thước màn hình khác nhau. Tôi đã có một vài đoạn được tạo và đã sử dụng chúng thành công. Nhưng tôi đã có một tình huống mà tôi muốn thể hiện một đoạn trong một hoạt động bình thường trên điện thoại, nhưng muốn thể hiện đoạn trong PopupWindow (hoặc một thứ tương tự nếu có lựa chọn tốt hơn) trên máy tính bảng.Tạo đúng một đoạn trong PopupWindow

Tôi đã tìm ra cách thổi phồng mảnh và hiển thị nó trong PopupWindow khi nút được nhấp. Mã của tôi trông giống như sau:

public void onClick(View v) { 
    LayoutInflater inflater = (LayoutInflater) BrowsingActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View popupLayout = inflater.inflate(R.layout.serverconnection_fragment, null, false); 
    connectionListPopup = new PopupWindow(popupLayout, 300, 470, true); 
    connectionListPopup.showAtLocation(BrowsingActivity.this.findViewById(R.id.connectionListImage), Gravity.CENTER, 0, 0); 
} 

Cửa sổ bật lên xuất hiện và chứa giao diện người dùng được mô tả trong serverconnection_fragment.xml. Vấn đề là bằng cách tạo nó theo cách này, lớp Fragment ServerConnectionFragment.java không bao giờ được khởi tạo nên không có mục nào trong danh sách trong giao diện người dùng của tôi, không có trình lắng nghe trên các nút, v.v. Có vẻ như có một cách để tôi khởi tạo lớp java, làm cho nó bung ra các mảnh thông thường và đính kèm các trình lắng nghe sự kiện, sau đó chuyển khung nhìn được tạo vào đó vào hàm tạo PopupWindow, nhưng tôi không thể hiểu được làm thế nào. Ai có thể giúp tôi không?

FYI, tôi đang xây dựng ứng dụng này cho Android 2.1 bằng tệp hỗ trợ Android-v4.jar cho các lớp Phân đoạn.

Trả lời

17

Việc thổi trực tiếp bố cục sẽ không làm cho nó hiển thị đoạn; Android sẽ chỉ xem xét nó một sự trùng hợp ngẫu nhiên mà cả đoạn và hoạt động đang cố gắng tham chiếu đến cùng một tệp bố cục.

Thông thường, bạn sẽ sử dụng FragmentManager.add(int,Fragment) để thêm phân đoạn vào bố cục. Tuy nhiên, id vùng chứa mà bạn chỉ định phải là một phần của bố cục của Hoạt động hiện tại và đây không phải là trường hợp với PopupWindow. Thay vào đó, bạn sẽ phải thêm phân đoạn vào trình quản lý phân đoạn mà không chỉ định vùng chứa, và sau đó một lúc sau trong đoạn (ví dụ: onStart()), bạn có thể hiển thị PopupWindow. Đây chính xác là cách hoạt động của DialogFragment và vì đã có rất nhiều hỗ trợ, nên tôi khuyên bạn nên chuyển sang sử dụng DialogFragment thay thế.

Với mã Fragment của bạn, chỉ cần mở rộng DialogFragment thay vì Fragment và sử dụng DialogFragment.show(FragmentManager,String) để hiển thị nó. Bạn có thể loại bỏ đường viền mặc định bằng cách gọi setStyle(DialogFragment.STYLE_NO_FRAME, getTheme()) theo phương thức onCreate. Bạn vẫn có thể thêm Phân đoạn này vào bố cục (như bạn nói, trên điện thoại bạn không muốn nó được hiển thị dưới dạng cửa sổ bật lên) và nó sẽ hoạt động như cách bạn mong đợi.

+0

Chắc chắn câu trả lời đúng, cảm ơn Ngoài ra, khi chúng tôi hiển thị danh sách trong PopupWindow, từ chối hiển thị ContextMenu mà chúng tôi đã chỉ định cho danh sách. Chuyển sang DialogFragment cho phép chúng tôi giải quyết điều đó. –

+1

Bạn có thể, vui lòng giải thích hoặc minh họa câu cuối cùng của bạn, nếu có thể thêm đoạn vào Popupwindow, ví dụ ban đầu? "Bạn vẫn có thể thêm Fragment này vào bố cục (như bạn nói, trên điện thoại bạn không muốn nó được hiển thị dưới dạng cửa sổ bật lên) và nó sẽ hoạt động như cách bạn mong đợi. " – JPMagalhaes

+1

@JPMagalhaes, Bạn không nên sử dụng phân đoạn trong PopupWindow vì nó có thể giới thiệu vấn đề rò rỉ bộ nhớ – Jacky

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