2011-12-17 9 views
3

私がアーカイブしようとしているもの:カスタムビューのダイアログが必要ですが、AlertDialogの標準アイコン、タイトル、ボタンが必要です。私がやっている何標準のアイコン、タイトル、ボタンを持つプラットフォームのバージョンに依存しないカスタムダイアログ

は、このカスタムダイアログクラスである:

public class CustomDialog extends AlertDialog.Builder { 

    private Activity activity; 
    private View root; 

    public CustomDialog(Activity context) { 
     super(context); 
     this.activity = context; 
    } 

    public void setView(int layoutResID) { 
     LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     root = inflater.inflate(layoutResID, (ViewGroup) activity.findViewById(R.id.dialog_root), false); 
     ScrollView scroller = new ScrollView(activity); 
     scroller.addView(root); 
     setView(scroller); 
    } 

    public void setCustomView(View v) { 
     ScrollView scroller = new ScrollView(activity); 
     scroller.addView(v); 
     setView(scroller); 
    } 

    public View getRoot() { 
     return root; 
    } 

    @Override 
    public AlertDialog create() { 
     AlertDialog dialog = super.create(); 

     dialog.getWindow().getAttributes().width = LayoutParams.MATCH_PARENT; 

     return dialog; 
    } 
} 

これはかなり良い作品、TextView色は前ハニカムハニカムデバイス上で正しくありません期待しています。私はHolo.Lightテーマを使用していますので、標準的なテキストの色は黒ですが、ハニカム前のデバイスのダイアログの背景色も同じです。ハニカムデバイスでは、ダイアログの背景が白です。だから、私はvaluesフォルダのstyles.xmldialogTextColor=whiteを追加し、values-v11フォルダにはdialogTextColor=blackを追加しました。次に、カスタムダイアログで使用しているTextViewにスタイル属性を追加する必要がありました。これはICSまで機能しましたが、なぜ> - v11であるのかは明らかです。私はそれを変更することができますが、私はすべての正しいことを行うカスタムダイアログをしたい:アプリケーションのテーマ、ダイアログの幅に基づいて、前ハニカム、ハニカム、ICS(と将来来るもの) AlertDialogの標準ボタン、タイトル、アイコン。

答えて

11

ここでのトリックは、コンテキストがテーマに関連付けられていることです。このテーマは、デフォルトのテキストの色など、あらゆる種類のものを決定します。

ハニカムダイアログの前には、明るいまたは暗いテーマのアクティビティから生成されたかどうか、およびリストを除いて常に同じテーマが使用されました。 。ハニカムとフォワードでは、ダイアログにはアクティビティによって異なるテーマが設定されています。

ダイアログ内のコンテンツを膨張させるときは、常にダイアログを生成したアクティビティではなく、Dialog#getContext()メソッドによって返されたコンテキストを使用します。代わりに、あなたのLayoutInflater上記取得するために使用するコードの行を、試してみてください。

LayoutInflater inflater = LayoutInflater.from(getContext()); 

編集:あなたはAlertDialog.Builder代わりのダイアログを使用しているように見えますが。 AlertDialog.BuilderはAPI 11(Android 3.0、a.k.a. Honeycomb)でこの目的のためにgetContext()メソッドを追加しましたが、その前には存在しませんでした。あなたは、古いデバイス用にContextThemeWrapperを使用して独自のテーマのコンテキストを構築することができます。古いバージョンのプラットフォームでそのメソッドを呼び出さないようにしてください。あなたは簡単なチェックでそれを守ることができます:

Context themedContext; 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
    themedContext = getContext(); 
} else { 
    themedContext = new ContextThemeWrapper(activity, android.R.style.Theme_Dialog); 
} 
LayoutInflater inflater = LayoutInflater.from(themedContext); 
+0

これは意味があります。私はこれを試すつもりです –

+0

getContextはNoSuchMethodErrorを引き起こし、私がやっているのはactivity.getApplicationContext()です。これはあなたが言ったように動作します。ありがとうございました:) –

+0

私はちょうど1つの問題に気づいた。 RadioButtonsやTimePickerなどのTextViewが含まれているウィジェットは、ハニカムとICS(不可視)では白、ハニカム前(可視)では黒です。 –

関連する問題