Đây có thể không phải là câu trả lời bạn mong đợi.
Hãy xem xét một câu hỏi khác: Chúng tôi có thể thay đổi chủ đề hoạt động sau khi setContentView(...)
được gọi không? Câu hỏi đã được hỏi nhiều lần và giải pháp phổ biến là tạo lại (gọi số finish()
và startActivity(getIntent())
) hoạt động và đặt chủ đề mới trước setContentView(...)
.
Câu hỏi của bạn là một phần mở rộng cho điều này - với sự phức tạp của việc thay đổi chủ đề từ một đoạn. Trong mọi trường hợp, tôi không xem xét giải pháp được đề cập ở trên một giải pháp tốt.
ActionBar là một trong những thành phần đầu tiên được khởi tạo khi một Hoạt động được tạo. Tôi không nghĩ rằng bạn sẽ tìm thấy một cách để bằng cách nào đó 'làm mới' nó với các thuộc tính mới. Xem dưới đây như thế nào requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY)
giao phương pháp với hậu setContentView (...) gọi:
@Override
public boolean requestFeature(int featureId) {
if (mContentParent != null) {
throw new AndroidRuntimeException("requestFeature() must be
called before adding content");
}
....
....
}
Vì vậy, nếu setContentView(...)
đã được kêu gọi Hoạt động (mà nó là, trong trường hợp của bạn), một runtime-ngoại lệ sẽ bị ném.
Có thể bạn thậm chí không cần chức năng này?
Bắt đầu bằng cách thiết lập ActionBar là một lớp phủ trong chủ đề của bạn:
<item name="android:windowActionBarOverlay">true</item>
<!-- Support library attribute for compatibility -->
<item name="windowActionBarOverlay">true</item>
Dưới đây là vấn đề của tôi. Tôi muốn các actionbar được hiển thị như lớp phủ ở một số mảnh vỡ ...
Được rồi. Chúng tôi đã cung cấp cho điều này ở trên.
... nhưng không phải ở những người khác.
Giả sử bạn không muốn có ActionBar làm lớp phủ trong Phân đoạn B.Sau đó, trong bố trí Fragment B, làm như sau:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="?android:attr/actionBarSize" > <<<-- ?attr/actionBarSize
for compatibility
....
....
</LinearLayout>
Với top-margin thiết lập để kích thước ActionBar của, Fragment B trông như thể nó có một ActionBar thường - không một ai được che phủ. Một cách khác để đạt được điều này là có một số View
với số android:layout_height="?android:attr/actionBarSize"
được đặt làm đứa trẻ đầu tiên trong bố cục ở trên.
Về bản chất:
- ActionBar của bạn sẽ trở thành một lớp phủ.
- trong các đoạn mà ActionBar sẽ tự động ẩn, bố cục phân đoạn sẽ không có bất kỳ bộ lề trên cùng nào.
- trong các đoạn mà thanh tác vụ không được phủ lên, bố cục phân đoạn sẽ có lề trên được đặt thành
actionBarSize
.
Một điểm đáng chú ý (nhờ Jelle
):
Nếu ActionBar
của bạn là bán trong suốt, nó sẽ là tốt nhất để sử dụng đệm thay vì lợi nhuận cho một cái nhìn nhất quán.
Thanh hành động phụ thuộc vào hoạt động không thể thực hiện được với thanh tác vụ mặc định mà bạn có thể muốn tạo thanh tác vụ của riêng mình như bố cục và sau đó bạn có thể kiểm soát nhiều hơn. Tôi sẽ đề nghị điều này nếu bạn chỉ sử dụng thanh hành động như đối với thanh tiêu đề –
Tôi hiểu rằng thanh hành động phụ thuộc vào hoạt động. Và tôi đang sử dụng thanh tác vụ nhiều hơn một thanh tiêu đề. Những gì tôi đang nghĩ là nếu có một cách để thay đổi acionbar từ bên trong mảnh bằng cách gọi lại vào hoạt động chính. Vấn đề là tôi cần phải làm điều đó một cách lập trình bởi vì đã quá muộn để áp dụng thay đổi qua các chủ đề (tôi nghĩ). ????? – JustLearningAgain
Nếu tôi hiểu tất cả những gì bạn muốn là có thể sửa đổi Thanh Hành động từ đoạn của bạn phải không? –