2013-09-03 20 views
35

こんにちは、私はすでにDialogFragmentを書いています。今私はそれがAlertDialogのように肯定的で否定的なボタンを持ってほしいと思った。私が書いたコードを維持しながら、どうすればこのようなことができますか?DialogFragmentのダイアログに肯定/否定ボタンを追加する

public class DoublePlayerChooser extends DialogFragment { 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);   

    setStyle(DialogFragment.STYLE_NORMAL,0); 



} 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 

    return new AlertDialog.Builder(getActivity()) 
      .setTitle("title") 
      .setPositiveButton("OK", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 
         // do something... 
        } 
       } 
      ) 
      .setNegativeButton("Cancel", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 
         dialog.dismiss(); 
        } 
       } 
      ) 
      .create(); 
} 



@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View v = inflater.inflate(R.layout.doubleplayerchooser, container, false); 
    getDialog().setTitle("Enter Players"); 

    firstPlayerPicker = (ImageButton) v.findViewById(R.id.imageButton1); 
    firstPlayerPicker.setOnClickListener(new OnClickListener() { 
     public void onClick(final View v){ 

      callContactPicker(1); 

     }  
    }); 

    secondPlayerPicker = (ImageButton) v.findViewById(R.id.ImageButton01); 
    secondPlayerPicker.setOnClickListener(new OnClickListener() { 
     public void onClick(final View v){ 

      callContactPicker(2); 

     }  
    }); 

    loadFromFile = (ImageButton) v.findViewById(R.id.imageButton2); 
    loadFromFile.setOnClickListener(new OnClickListener() { 
     public void onClick(final View v){ 



     }  
    }); 

    firstTextfield = (EditText) v.findViewById(R.id.editText1); 
    secondTextfield = (EditText) v.findViewById(R.id.EditText01); 

    firstImage = (ImageView) v.findViewById(R.id.imageView1); 
    secondImage = (ImageView) v.findViewById(R.id.ImageView01); 



    return v; 
} 

答えて

66

これは私がそれを理解した方法です。私はonCreateViewを消去し、onCreateDialogを変更しました このlinkは実際にすべてのクレジットがそこに行かなければならないので実際に答えがありました。私はちょうどこのスレッドで誰かがぶつかる場合に備えて投稿しました。

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 

    AlertDialog.Builder b= new AlertDialog.Builder(getActivity()) 
    .setTitle("Enter Players") 
    .setPositiveButton("OK", 
     new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int whichButton) { 
       // do something... 
      } 
     } 
    ) 
    .setNegativeButton("Cancel", 
     new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int whichButton) { 
       dialog.dismiss(); 
      } 
     } 
    ); 

    LayoutInflater i = getActivity().getLayoutInflater(); 

    View v = i.inflate(R.layout.doubleplayerchooser,null); 

    firstPlayerPicker = (ImageButton) v.findViewById(R.id.imageButton1); 
    firstPlayerPicker.setOnClickListener(new OnClickListener() { 
     public void onClick(final View v){ 

      callContactPicker(1); 

     }  
    }); 

    secondPlayerPicker = (ImageButton) v.findViewById(R.id.ImageButton01); 
    secondPlayerPicker.setOnClickListener(new OnClickListener() { 
     public void onClick(final View v){ 

      callContactPicker(2); 

     }  
    }); 

    loadFromFile = (ImageButton) v.findViewById(R.id.imageButton2); 
    loadFromFile.setOnClickListener(new OnClickListener() { 
     public void onClick(final View v){ 



     }  
    }); 

    firstTextfield = (EditText) v.findViewById(R.id.editText1); 
    secondTextfield = (EditText) v.findViewById(R.id.EditText01); 

    firstImage = (ImageView) v.findViewById(R.id.imageView1); 
    secondImage = (ImageView) v.findViewById(R.id.ImageView01); 


    b.setView(v); 
    return b.create(); 
} 
6

あなたはオーバーライドにDialogFragments onCreateDialog(...)メソッドがあります。あなたが取得しているエラーメッセージ(「要求に応じAndroid: disable DialogFragment OK/Cancel buttons

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 

    return new AlertDialog.Builder(getActivity()) 
      .setTitle("title") 
      .setPositiveButton("OK", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 
         // do something... 
        } 
       } 
      ) 
      .setNegativeButton("Cancel", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 
         dialog.dismiss(); 
        } 
       } 
      ) 
      .create(); 
} 

はここから撮影を機能を呼び出す必要があります... ")私はお勧めします:

アクティビティ内のrequestFeature()より前にはsetContentView()をコールしないでください。さらに

いけないコールのsetStyle(...)のonCreate()内。

フラグメントを作成する場所を呼び出します。 DialogFragment hereについての詳しい情報

public class FireMissilesDialogFragment extends DialogFragment { 
@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    // Use the Builder class for convenient dialog construction 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    builder.setMessage(R.string.dialog_fire_missiles) 
      .setPositiveButton(R.string.fire, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        // FIRE ZE MISSILES! 
       } 
      }) 
      .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        // User cancelled the dialog 
       } 
      }); 
    // Create the AlertDialog object and return it 
    return builder.create(); 
} 
} 

:アクションボタンを追加するには

YourDialogFragment f = new YourDialogFragment(Context); 
f.setStyle(...); 
// and so on ... 
+2

コンテンツを追加する前に例外リクエスト機能を呼び出す必要があります。 – Libathos

+0

あなたのコードを投稿して、私の更新された回答を見てください。 –

+0

私はonCreateViewを削除すると、エラーなしで実行されます。これは役に立ちます – Libathos

1

最も明瞭な方法です。

// Your own onCreate_Dialog_View method 
public View onCreateDialogView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.your_layout, container); // inflate here 
} 

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    // do something with 'view' 
} 

@NonNull 
@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    // setup dialog: buttons, title etc 
    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getActivity()) 
      .setTitle(R.string.dialog_fragment_author_title) 
      .setNegativeButton(R.string.dialog_fragment_author_close, 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int whichButton) { 
          dialog.dismiss(); 
         } 
        } 
      ); 

    // call default fragment methods and set view for dialog 
    View view = onCreateDialogView(getActivity().getLayoutInflater(), null, null); 
    onViewCreated(view, null); 
    dialogBuilder.setView(view); 

    return dialogBuilder.create(); 
} 
0

これは少し古いですが、AppCompatDialogFragmentを拡張する際に、最近私がonCreateViewをオーバーライドしてきました。 onCreateViewに返すレイアウトと同じレイアウトに自分のボタンを置くだけです - @style/Widget.AppCompat.Button.Borderlessのようなスタイルを使用してください。

特に、これらのカスタムビューに入力が必要な場合があり、ボタンがクリックされたときにダイアログの自動クローズをブロックするため、アクションボタンがクリックされたときにダイアログの自己消滅を制御するという追加の利点があります。

onCreateDialogのカスタムビューを使用すると、コンテナなしで膨張させるため、常に汚い感じがします。 Googleは、新しいv7 AlertDialog.BuilderメソッドsetView(int layoutResId)でAPIを少しうまく使ってみましたが、findViewByIdに電話をかけることはできません。

あなたのスタイルにこのようなテーマを追加する必要があります。XML:

<style name="AlertDialog" parent="Theme.AppCompat.Light.Dialog.Alert"> 
    <item name="colorPrimary">@color/material_light_blue_500</item> 
    <item name="colorPrimaryDark">@color/material_light_blue_800</item> 
    <item name="colorAccent">@color/material_light_blue_a400</item> 
    <item name="colorButtonNormal">@color/material_light_blue_500</item> 
    <item name="colorControlNormal">@color/material_light_blue_600</item> 
    <item name="colorControlActivated">@color/material_light_blue_a100</item> 
    <item name="colorControlHighlight">@color/material_light_blue_a100</item> 
</style> 

あなたにもnew AppCompatDialog(getActivity(), R.style.AlertDialog)返すために、あなたのDialogFragmentでonCreateDialogをオーバーライドする必要があります。

関連する問題