2
解決済み:以下の回答を参照してください。カスタムビューの背景を持つダイアログ
私はカスタム背景を持つダイアログを作成するためにダイアログをサブクラス化しています。ダイアログにサブクラスのビューを追加し、ビットマップの背景とレイアウトを正しく描画しています。しかし、ボタンはタッチイベントに応答しません。
私はLinearLayoutがDialogクラスに読み込まれていると思っていますが、ビットマップの上に描画するためには、ビュークラスにロードする必要があると思います。
私はAndroidデベロッパーにとってまったく新しく、質問にお詫び申し上げます。私がやっていることは次のとおりです。
public class CustomDialog extends Dialog {
private static final String TAG = "CustomDialog";
private static int layoutWidth = 640;
private static int layoutHeight = 400;
public CustomDialog(Context context) {
super(context, android.R.style.Theme_Translucent_NoTitleBar);
requestWindowFeature(Window.FEATURE_NO_TITLE);
LayoutParams params = getWindow().getAttributes();
params.width = LayoutParams.FILL_PARENT;
getWindow().setAttributes((android.view.WindowManager.LayoutParams) params);
// setContentView(R.layout.layout_dialog); // This works fine, the buttons work
setContentView(new NewLayoutDialogView(context));
}
public static class NewLayoutDialogView extends View {
private Drawable bg;
public LinearLayout layout;
private OnColorChangedListener mListener;
public interface OnBrushChangedListener {
void brushChanged(float radius);
}
NewLayoutDialogView(Context context) {
super(context);
InputStream stream = getResources().openRawResource(R.drawable.dialog_bg);
bg = NinePatchDrawable.createFromStream(stream, null);
layout = (LinearLayout) LinearLayout.inflate(context, R.layout.layout_dialog, null);
Button ok = (Button) layout.findViewById(R.id.ok_button);
layout.setWillNotDraw(false);
layout.setVisibility(View.VISIBLE);
setVisibility(View.VISIBLE);
layout.measure(layoutWidth, layoutHeight);
layout.layout(0, 0, layoutWidth, layoutHeight);
}
@Override
protected void onDraw(Canvas canvas){
if (bg != null) {
bg.setBounds(10, 0, canvas.getWidth(), canvas.getHeight());
bg.draw(canvas);
}
layout.draw(canvas);
}
}
}
編集:これはリスナーを設定する方法です。表示サブクラスを使用するときは、このコードを無効にする必要があります。しかし、ボタンはまだクリックされていないリスナーなしでクリック状態を表示する必要があります。
Dialog dialog = new ChangeLayoutDialog(getActivity());
Button cancel = (Button) dialog.findViewById(R.id.cancel_button);
cancel.setTypeface(font);
cancel.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
dialog.dismiss();
}
});
Button ok = (Button) dialog.findViewById(R.id.ok_button);
ok.setTypeface(font);
ok.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
dialog.dismiss();
setCellLayout(layoutFile);
}
});
ただし、クリックリスナーをどこに[OK]ボタンに設定していますか? – Cata
ダイアログが作成されるリスナを設定していましたが、上記のコードでリスナを無効にする必要があります。しかし、リスナーがいなくても、ボタンが私が触れていない接触状態に反応するのを見なければなりません。上記のリスナーを追加しました。 –
サブビュークラスを追加するのではなく、背景を描画する代わりに、ウィンドウに背景を追加するだけです。これは動作しています: getWindow()。setBackgroundDrawableResource(R.drawable.dialog_bg); ここでは、ウィンドウサイズの設定方法を理解するだけです。 –