2010-01-27 2 views
6

Tôi đang thử nghiệm ứng dụng của mình trên Nexus One và tôi có một số vấn đề. Chủ đề của tôi là Light và khi một màn hình PreferenceScreen bên trong được hiển thị, nền cửa sổ trở thành màu đen thay vì giữ phần PreferenceActivity.Bối cảnh từ PreferenceActivity không được áp dụng cho sub-PreferenceScreen

<PreferenceScreen android:title="main preferences"> 
    ... 
    <PreferenceScreen android:title="sub screen"> 
    </PreferenceScreen> 
</PreferenceScreen> 

Sự cố là gì?

Wouter

+0

Bạn có thể hiển thị ảnh chụp màn hình giống như trước khi bạn thêm Màn hình ưu tiên thứ hai và sau đó không? – CaseyB

+0

Đây là màn hình chính của tôi http://snapplr.com/fqxc, Vì vậy, khi tôi nhấp vào "Herinneringen" (tiếng Hà Lan cho thông báo) nó cho tôi thấy http://snapplr.com/gjzd này (Và không có mũi tên nào bên cạnh Herinneringen, nơi nên có một!) Có vấn đề gì ở đây? – wouter88

+0

Bạn đang tải một hoạt động mới hay chỉ là bạn đang tăng cường và phủ một chế độ xem? – CaseyB

Trả lời

1

Để hiểu tốt nhất những gì đang xảy ra ở đây bạn có thể tham khảo đoạn mã này từ mã nguồn cho lớp PreferenceScreen:

@Override 
    protected void onClick() { 
     if (getIntent() != null || getPreferenceCount() == 0) { 
      return; 
     } 

     showDialog(null); 
    } 

    private void showDialog(Bundle state) { 
     Context context = getContext(); 
     ListView listView = new ListView(context); 
     bind(listView); 

     // Set the title bar if title is available, else no title bar 
     final CharSequence title = getTitle(); 
     Dialog dialog = mDialog = new Dialog(context, TextUtils.isEmpty(title) 
       ? com.android.internal.R.style.Theme_NoTitleBar 
       : com.android.internal.R.style.Theme); 
     dialog.setContentView(listView); 
     if (!TextUtils.isEmpty(title)) { 
      dialog.setTitle(title); 
     } 
     dialog.setOnDismissListener(this); 
     if (state != null) { 
      dialog.onRestoreInstanceState(state); 
     } 

     // Add the screen to the list of preferences screens opened as dialogs 
     getPreferenceManager().addPreferencesScreen(dialog); 

     dialog.show(); 
    } 

Cách mà tôi làm việc xung quanh nó là để thiết lập màu nền cha mẹ bằng cách ghi đè lên chế độ Xem trước trong tùy chọn đầu tiên được thêm vào màn hình tùy chọn. Tất nhiên điều này đòi hỏi một số mã tùy chỉnh nhưng nó không phải terribly phức tạp, ví dụ để thiết lập một nền trắng:

package com.justinbuser.livewallpapers; 

import android.preference.PreferenceCategory; 

public class VideoChooserPreferenceCategory extends PreferenceCategory{ 

    public VideoChooserPreferenceCategory(Context context) { 
     super(context); 
    } 

    @Override 
    protected View onCreateView(ViewGroup parent) 
    { 
     parent.setBackgroundColor(0xFFFFFFFF); 
     return super.onCreateView(parent); 
    } 
} 

Bạn sẽ thì tất nhiên cần phải sử dụng loại tùy chỉnh bằng cách thay đổi xml của bạn, ví dụ:

<PreferenceScreen android:title="main preferences"> 
    <PreferenceScreen android:title="sub screen"> 
    <com.justinbuser.livewallpapers.VideoChooserPreferenceCategory android:title="sub screen category" /> 
    </PreferenceScreen> 
</PreferenceScreen> 

Ngoài ra, nếu bạn thấy Android PreferenceScreen thay đổi chủ đề dựa trên việc tiêu đề có được đặt hay không, tức là nếu tựa đề tồn tại, nó sẽ bật chủ đề bao gồm thanh tiêu đề. Vì vậy, nếu bạn không muốn thanh tiêu đề, bạn nên tránh đặt tiêu đề preferencescreen và đặt nó tĩnh trong xml hoặc động thông qua mã.

2

Sử dụng này:

Tạo chủ đề trong tập tin style.xml

<style name="Theme.SettingsBackground" parent="@android:style/Theme.NoTitleBar"> 
<item name="android:windowBackground">@android:color/black</item> 
</style> 

và sau đó sử dụng file manifest:

<activity android:name=".Settings" android:theme="@style/Theme.SettingsBackground"></activity> 

Làm điều này cho tất cả các hoạt động phụ mà bạn muốn.

+0

Làm việc cho tôi, cảm ơn rất nhiều –

1

Bạn đã thử điều này chưa?

@Override 
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference){ 
     super.onPreferenceTreeClick(preferenceScreen, preference); 
     if (preference!=null) 
      if (preference instanceof PreferenceScreen) 
       if (((PreferenceScreen)preference).getDialog()!=null) 
        ((PreferenceScreen)preference).getDialog().getWindow().getDecorView().setBackgroundDrawable(this.getWindow().getDecorView().getBackground().getConstantState().newDrawable()); 
     return false; 
    } 

Thêm phương thức này vào PreferenceActivity của bạn.

Tại nhận xét số 35 từ số source này.