2011-10-19 17 views
2

AlertDialogsを正しく拡張し、期待される動作を得る方法の例がたくさんありますが、ほとんど見つけられません。AndroidでのAlertDialogの拡張(例、タイトルとボタンの入手方法)

グーグル上のドキュメントは、どちらもどちらかといえば大したことではありません。

はい、私はAlertDialog.Builderを使用して最も多くのコモンズを構築できますが、何らかの理由で自分のAlertDialogsを作成したいと思っています(一つの理由で別々のJavaファイルに入れたいコードがあります)。

私はPausDialog.javaを(以下のコードを参照してください)作成して、それが現れるが、私は、ダイアログに表示するタイトルまたはボタン(正、負など)のいずれかを取得することができません。だから、

No buttons and no title in the PausDialog

、 質問1:この写真を参照してください。私が正しくAlertDialogsを拡張すると、その後、それらを使用する方法をどのように、良いクリーンで有用な例を見つけることができます

質問2:なぜでき下のカスタムAlertDialogを使っているタイトルやボタンは表示されません。


PausDialog.java

package Test; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.os.Handler; 
import android.os.SystemClock; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.view.Gravity; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.Window; 
import android.view.WindowManager; 
import android.view.inputmethod.InputMethodManager; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 

public class PausDialog extends AlertDialog 
{ 

    protected PausDialog(Context context) 
    { 
     super(context, R.style.DialogTheme); 

    } 

    @Override 
    protected void onCreate(android.os.Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.paus); 
     WindowManager.LayoutParams params = getWindow().getAttributes(); 
     params.gravity = Gravity.TOP; 

     final EditText ed1= (EditText) findViewById(R.id.editTextPausArea); 
     final EditText ed2= (EditText) findViewById(R.id.EditTextPausTimeFrom); 
     final EditText ed3= (EditText) findViewById(R.id.EditTextPausTimeTo); 

     TextView tv1 = (TextView)findViewById(R.id.textViewPausArea); 
     tv1.setText(LanguageHandler.GetString("AREA")); 
     tv1 = (TextView)findViewById(R.id.textViewPausTime); 
     tv1.setText(LanguageHandler.GetString("TIME")); 

     setButton(DialogInterface.BUTTON_POSITIVE, "Positive", 
      new OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 

        int fromArea = 0; 
        int fromTime = 0; 
        int toTime = 0; 

        try 
        { 
         fromArea = Integer.parseInt(ed1.getText().toString()); 
         fromTime = Integer.parseInt(ed2.getText().toString()); 
         toTime = Integer.parseInt(ed3.getText().toString()); 

        } 
        catch(Exception e) 
        { 
         // TODO fail 
        }      
       } 
      }); 

     setButton(DialogInterface.BUTTON_NEGATIVE, "Negative", 
       new OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         // Do something 
        } 
       }); 
    } 
} 

MainActivity.java、呼び出しPausDialogを:

PausDialog pd = new PausDialog(MainActivity.this); 
pd.show(); 

私PausDialog、paus.xmlのレイアウトは:

私の場合は
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:weightSum="1"> 
    <RelativeLayout android:gravity="top" android:layout_height="200dp" android:layout_weight="0.11" android:layout_width="304dp"> 
     <TextView android:layout_alignParentLeft="true" android:text="Område" android:layout_width="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:id="@+id/textViewPausArea" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_marginLeft="17dp" android:layout_marginTop="18dp"></TextView> 
     <EditText android:layout_alignBaseline="@+id/textViewPausArea" android:id="@+id/editTextPausArea" android:layout_width="80dp" android:layout_alignBottom="@+id/textViewPausArea" android:inputType="number" android:layout_height="wrap_content" android:layout_toRightOf="@+id/textViewPausArea" android:layout_marginLeft="17dp"> 
      <requestFocus></requestFocus> 
     </EditText> 
     <TextView android:text="Tid" android:layout_width="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:layout_below="@+id/editTextPausArea" android:id="@+id/textViewPausTime" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:layout_alignLeft="@+id/textViewPausArea"></TextView> 
     <EditText android:layout_alignBaseline="@+id/textViewPausTime" android:id="@+id/EditTextPausTimeFrom" android:layout_width="80dp" android:layout_alignBottom="@+id/textViewPausTime" android:inputType="time" android:layout_height="wrap_content" android:layout_alignLeft="@+id/editTextPausArea"></EditText> 
     <TextView android:text=" - " android:layout_width="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:id="@+id/textView3" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/EditTextPausTimeFrom" android:layout_alignBottom="@+id/EditTextPausTimeFrom" android:layout_toRightOf="@+id/EditTextPausTimeFrom"></TextView> 
     <EditText android:id="@+id/EditTextPausTimeTo" android:layout_width="80dp" android:inputType="time" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/textView3" android:layout_alignBottom="@+id/textView3" android:layout_toRightOf="@+id/textView3"></EditText>  

    </RelativeLayout> 

</LinearLayout> 
+0

を:しかし、あなたは、あなたがsuper.onCreate()例を呼び出す前にそれをやって確認してください? – user370305

+0

必要ならば?まあ、AlertDialogが必要なだけで、そのダイアログだけのカスタムコードを持っていれば、私は推薦できると言っています。 – Ted

答えて

0

は、私がDialog baseclassを使用するためのカスタムクラスとして拡張し、また、それが正常に動作し、この例では

見て、彼らは、

How to display a custom dialog in your Android application

をカスタムダイアログについての素晴らしい説明を与えます

Android custom Dialog

Android custom Dialog Sample

+0

ありがとうございます。私はそれを徹底的に調べます。しかし、私は完全なDialogを実装する必要はないと思っていましたが、別の動作も必要とする特定の部分をオーバーライドするだけです...私が必要とする機能の大部分を持つAlertDialogを目指していたのはなぜですか?いくつかのものを調整する=) – Ted

1

Iグラム私のカスタムAlertDialogは、このコードに似た何かを使って動作します。

まず公的にアクセス可能な

public PausDialog(Context context) 

あなたのコンストラクタを作るそして、あなたは単にそれをインスタンス化して表示することができます:

PauseDialog newDialog = new PauseDialog(this); 
newDialog.setTitle("My Dialog"); 
newDialog.setButton("OK", ...); // Insert your onClick implementation 
newDialog.setButton2("Cancel", ...); // Insert your onClick implementation 
newDialog.Show(); 
+1

この方法の問題は、AlertDialog.Builderを使ってダイアログを構築することができないということです。 –

4

を私はBuilderクラスを拡張して独自のカスタムAlertDialogを成功裏に行きました。その後

public class MyDialog extends AlertDialog.Builder { 
    private Context mContext; 
    private AlertDialog mAlertDialog; 

    public MyDialog(Context context) { 
     super(context); 
     mContext = context; 
    } 

    @SuppressLint("InflateParams") 
    @Override 
    public AlertDialog show() { 
     View view = LayoutInflater.from(mContext).inflate(R.layout.my_dialog, null); 

     ... 
     mAlertDialog = super.show(); 
     return mAlertDialog; 
    } 

} 

、コードから、私はこのようにそれらをインスタンス化:

MyDialog myDialog = new MyDialog(getActivity()); 
myDialog.show(); 

唯一の注意点は、あなたが向きを変更しないか、または他のイベントに適切にダイアログを却下の世話をする必要があります戻るボタンや他の何かのような、dismiss()メソッドを明示的に呼び出します。そうしないと、そのダイアログからメモリリークが発生します。

1

カスタムAlertDialogを作成するオプションはほとんどありません。私はちょうどあなたに現在の質問に対する答えを与えたいと思います。 onCreate()メソッドでAlertDialogのタイトル、メッセージ、その他のコンポーネントを設定することができます。カスタムダイアログのためAlertDialogを延長する必要がある

public class PausDialog extends AlertDialog { 
      @Override 
      protected void onCreate(Bundle savedInstanceState) { 
       View content = LayoutInflater.from(getContext()).inflate(R.layout.dialog_some_view, null); 
       setView(content); 
       setTitle("Some Title"); 
       setMessage("Some Message"); 
       setButton(DialogInterface.BUTTON_POSITIVE, "Ok", new OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         Log.d("TAG", "BUTTON_POSITIVE"); 
        } 
       }); 
       ((TextView) content.findViewById(R.id.data)).setText(R.string.some_custom_data); 
       ((TextView) content.findViewById(R.id.description)).setText(getContext().getString(R.string.description)); 
       setCancelable(false); 
       setOnKeyListener((dialog, keyCode, event) -> keyCode == KeyEvent.KEYCODE_BACK); 

       super.onCreate(savedInstanceState); 
      } 
} 
関連する問題