2015-06-12 79 views
5

我想獲得一個擴展DialogPreference的類中運行的NumberPicker的半徑,並且讓setView()工作時遇到了很多麻煩。讓我們先從一些代碼:Alertdialog.Builder setview:調用需要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); 
    } 
} 

這給了我一個錯誤的builder.setView說「呼叫需要API 21(當前分鐘是15)。」我想支持使用API​​ 15+的設備,因此更改此設置不是一種選擇。現在,如果我嘗試重寫

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

相反,它說:「法不從它的超覆蓋方法。」

問題是,我該如何設置視圖?它不一定必須位於onPrepareDialogBu​​ilder()中,只要它支持API 15+。謝謝! PS:讓我知道你是否需要更多的代碼。爲了得到它顯示在XML,只需添加這一個<PreferenceScreen>

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

回答

18

什麼你想在這裏做的是調用在API 21中添加的一個補充,而不是一個函數在API 1中。根據the documentation,您需要setView(View view)而不是setView(int layoutResId)。要從佈局中獲得View,您需要一個LayoutInflater。要獲得LayoutInflater的實例,您需要一個上下文對象。當您創建對話框時,我建議將您的Context作爲變量存儲在課程中,以備將來使用。然後,在onPrepareDialogBuilder,你可以使用(as per the docs):

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

現在,你可以使用inflater充分利用您的佈局View並設置對話框的View如下:

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

所以,你的代碼可能看起來像:

@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); 
} 

希望這會有所幫助!

+1

糟糕,我錯過了setView(View)使用舊API的事實。謝謝,完美的作品。 –

+0

謝謝soooo!自從我將我的最小sdk更改爲15後,我一直試圖讓setView()繼續工作...... – Zillinium

0

我有一些不是那麼好玩的經驗試圖定製警報對話框,並建議只是繞過這個想法,當你真的需要有一個詳細彈出。這裏有一個,如果你想嘗試,而不是這條路的對話片段一些代碼...

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

嗯,我試圖讓它在首選項中運行,所以片段聽起來不像是最好的方式。當然,我可能是錯的,但根據我的理解,PreferenceDialog將是合乎邏輯的選擇。 我實際上有另一個RadiusPickerFragment類,它非常類似,我沒有問題,因爲它覆蓋了onCreateDialog()方法,所以我可以使用支持AlertDialog.Builder。我只想在首選項中擁有它,以便我可以設置默認值。 –

2

而不是調用setView(int resourceId),這需要API21 +只是創建一個View對象,膨脹資源和呼籲setView(View view)傳遞此視圖。

相關問題