2014-07-24 12 views
7

Tôi có một đoạn (Đoạn 1) được thay thế bởi một đoạn khác (Đoạn 2). Đoạn 1 được đặt trên ngăn xếp. Tôi đang sử dụng chế độ tương thích (không phải ActionBarSherlock).Thay đổi thanh hành động để che phủ từ bên trong Fragment

Đây là vấn đề của tôi. Tôi muốn thanh tác vụ được hiển thị dưới dạng lớp phủ trong một số đoạn, nhưng không được hiển thị ở các phần khác. Cụ thể, khi Phân đoạn 2 được hiển thị, tôi muốn nó xuất hiện trong lớp phủ và sau đó quay trở lại thanh hành động bình thường sau khi thoát khỏi đoạn 2.

Đoạn 1 có thanh tác vụ thông thường luôn hiển thị. Nhưng, khi tôi thay thế Fragment 1 bằng Fragment 2, tôi cần phải ẩn thanh hành động sau 5 giây. Nếu có sự kiện chạm, thanh tác vụ sẽ hiển thị lại. Điều này tất cả các công trình tốt, nhưng, Fragment 2 được vẽ lại mỗi khi thanh hành động được ẩn hoặc tiết lộ. Bởi vì điều này, tôi muốn làm cho thanh hành động trong Fragment 2 hiển thị như một lớp phủ.

Tôi biết tôi có thể thay đổi lớp phủ thanh tác vụ nhưng tôi không biết cách làm điều đó theo chương trình từ bên trong đoạn. Tôi KHÔNG muốn thay đổi nó cho từng mảnh, chỉ cần mảnh 2.

Ý tưởng ?????

+0

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 đề –

+0

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

+0

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? –

Trả lời

10

Đâ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()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.

+1

Tôi cũng sử dụng phương pháp này. Nếu 'LinearLayout' của bạn có một nền tùy chỉnh, có thể tốt hơn nên sử dụng' paddingTop' thay vì 'marginTop'. – Jelle

+1

@Jelle Ah vâng. Bạn đúng. Nếu thanh hành động là (bán) -transparent, ý tưởng của bạn sử dụng padding sẽ làm việc tốt nhất. Nhưng nếu thanh hành động có nền/màu mờ đục, lề sẽ tốt hơn - không bị rút tiền. Tôi sẽ chỉnh sửa câu trả lời của tôi để bao gồm điều này. Cảm ơn. – Vikram

+0

Suy nghĩ thật tốt về việc rút tiền! – Jelle

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