2015-06-12 34 views
5

Tôi đang cố gắng để có được một bán kính NumberPicker chạy trong một lớp mở rộng DialogPreference, và tôi gặp rất nhiều rắc rối khi setView() hoạt động. Hãy bắt đầu với một số mã:Alertdialog.Builder setview: Cuộc gọi yêu cầu cấp API 21

public class RadiusPickerPreference extends DialogPreference{ 
    public RadiusPickerPreference(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 
    @Override 
    protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder builder) { 
     builder.setTitle(R.string.set_radius_dialog_fragment_title); 
     builder.setView(R.layout.dialog_radius_picker); 
     builder.setPositiveButton(android.R.string.ok, null); 
     builder.setNegativeButton(android.R.string.cancel, null); 
    } 
} 

Điều này cho tôi lỗi trên builder.setXem "Call require API 21 (current min is 15)". Tôi muốn hỗ trợ các thiết bị có API 15+, vì vậy việc thay đổi này không phải là một tùy chọn. Bây giờ, nếu tôi cố gắng ghi đè

protected void onPrepareDialogBuilder(android.support.v7.app.AlertDialog.Builder builder)

thay vào đó, nó nói "Phương pháp không ghi đè phương pháp từ lớp cha của nó."

Câu hỏi là, làm cách nào tôi có thể đặt chế độ xem? Nó không nhất thiết phải nằm trong onPrepareDialogBuilder(), miễn là nó hỗ trợ API 15+. Cảm ơn!

PS: Hãy cho tôi biết nếu bạn cần thêm mã. Để có được nó hiển thị trong XML, chỉ cần thêm video này vào <PreferenceScreen>:

<com.example.project.RadiusPickerPreference 
    android:id="@+id/radPickerPref" 
    android:key="@string/pref_key_default_radius" 
    android:title="@string/pref_title_default_radius"/> 

Trả lời

18

Điều bạn đang cố gắng thực hiện ở đây là gọi hàm được thêm vào API 21 thay vì hàm được thêm vào trong API 1. Theo số the documentation, bạn muốn setView(View view) thay vì setView(int layoutResId). Để có được View từ bố cục, bạn cần LayoutInflater. Để có được một thể hiện của LayoutInflater, bạn sẽ cần một đối tượng ngữ cảnh. Khi bạn tạo hộp thoại của mình, tôi khuyên bạn nên lưu trữ Context làm biến trong lớp để sử dụng trong tương lai. Sau đó, trong onPrepareDialogBuilder, bạn có thể sử dụng (as per the docs):

LayoutInflater inflater = (LayoutInflater)context.getSystemService (Context.LAYOUT_INFLATER_SERVICE) 

Bây giờ, bạn có thể sử dụng inflater để có được một View từ cách bố trí của bạn và thiết lập của View thoại của bạn như sau:

View v = inflater.inflate(R.layout.dialog_radius_picker, null); 

Vì vậy, bạn mã có thể trông giống như:

@Override 
protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder builder) { 
    LayoutInflater inflater = (LayoutInflater)context.getSystemService (Context.LAYOUT_INFLATER_SERVICE); 
    builder.setTitle(R.string.set_radius_dialog_fragment_title); 
    View v = inflater.inflate(R.layout.dialog_radius_picker, null); 
    builder.setView(v); 
    builder.setPositiveButton(android.R.string.ok, null); 
    builder.setNegativeButton(android.R.string.cancel, null); 
} 

Hy vọng điều đó sẽ hữu ích!

+1

Rất tiếc, tôi đã bỏ lỡ thực tế là setView (Chế độ xem) đã hoạt động với các API cũ hơn. Cảm ơn, hoạt động hoàn hảo. –

+0

Cảm ơn rất nhiều! Tôi đã cố gắng để có được setView() để làm việc kể từ khi tôi thay đổi sdk tối thiểu của tôi đến 15 ... ... – Zillinium

0

Tôi đã có một số kinh nghiệm không quá vui vẻ cố gắng để tùy chỉnh các hộp thoại cảnh báo, và muốn giới thiệu chỉ bỏ qua ý kiến ​​cho rằng khi bạn thực sự cần phải có một chi tiết bật lên. Dưới đây là một số mã cho đoạn hộp thoại nếu bạn muốn thử tuyến đường đó thay thế ...

public class AboutUs extends DialogFragment { 



public interface DialogListener { 
    void onDialogFinish(); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_about_us, container, 
      false); 
    getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE); 

    Display display = getActivity().getWindowManager().getDefaultDisplay(); 
    Point size = new Point(); display.getSize(size); 
    int width=size.x; int height=size.y; //change these to make your dialog the size you wish 

    WindowManager.LayoutParams wmlp = getDialog().getWindow().getAttributes(); 
    wmlp.height=height; wmlp.width=width; 

    getDialog().getWindow().setAttributes(wmlp); 
    WindowManager.LayoutParams lp = getDialog().getWindow().getAttributes(); 
    lp.dimAmount=0.4f; 
    getDialog().getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); 
    getDialog().setCanceledOnTouchOutside(true); 



    return rootView; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setStyle(DialogFragment.STYLE_NO_FRAME, android.support.v7.appcompat.R.style.Theme_AppCompat_Light); 

} 


public AboutUs() 
{ 
} 


} 




\\to call fragment from activity 

AboutUs aboutUs = new AboutUs(); 
aboutUs.show(getSupportFragmentManager(), "Dialog Fragment"); 
+0

Vâng, tôi đang cố gắng để nó chạy trong Preferences, do đó, một Fragment không có vẻ như là cách tốt nhất để đi. Tất nhiên, tôi có thể sai, nhưng từ sự hiểu biết của tôi, một PreferenceDialog sẽ là sự lựa chọn hợp lý. Tôi thực sự có một lớp RadiusPickerFragment rất giống, mà tôi không có vấn đề gì, vì nó ghi đè phương thức onCreateDialog(), vì vậy tôi có thể sử dụng hỗ trợ AlertDialog.Builder. Tôi chỉ muốn có nó trong sở thích để tôi có thể thiết lập một mặc định. –

2

Thay vì gọi setView(int resourceId), yêu cầu API21 + chỉ cần tạo đối tượng View, hãy tăng nguồn tài nguyên và gọi setView(View view) chuyển chế độ xem này.

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