1

Возможно ли создать диалоговое окно DialogFragment и изменить контейнер по умолчанию? Я попробовал DialogFragment.show(Transaction, ...) и установил контейнер там, но потом он сообщает мне Fragment already added. Важно, чтобы DialogFragment вел себя как обычный DialogFragment.Выберите контейнер для DialogFragment

Редактировать: Я думаю, что есть некоторые недоразумения. Я сказал, что он должен выглядеть «как обычный DialogFragment». Я имею в виду, это должно выглядеть как обычный AlertDialog.

+0

добавить некоторые дополнительные сведения, такие как код, сообщения об исключениях. и «контейнер по умолчанию» относится к пользовательскому диалоговому окну ..? – Pravin

+0

Это общий вопрос. Я хочу иметь lockscreen поверх всего остального. Поэтому мне нужно поместить мои диалоговые окна в контейнер, который находится под строкой lockscreencontainer. – Kuno

+0

блокировка экрана - это виджет, чтобы вызвать его при блокировке экрана. Мы используем getWindow(). AddFlags (WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); –

ответ

1

Думаю, что DialogFragment простирается от Fragment, вы можете использовать его как обычно Fragment везде, где требуется. Он должен все еще реализовать все методы жизненного цикла Fragment. Тем не менее, я не уверен, что он отменяет любой из них для специальной цели.

0

здесь пример из DialogFragment

public static class MyDialogFragment extends DialogFragment { 
     int mNum; 

    /** 
    * Create a new instance of MyDialogFragment, providing "num" 
    * as an argument. 
    */ 
    static MyDialogFragment newInstance(int num) { 
     MyDialogFragment f = new MyDialogFragment(); 

     // Supply num input as an argument. 
     Bundle args = new Bundle(); 
     args.putInt("num", num); 
     f.setArguments(args); 

     return f; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mNum = getArguments().getInt("num"); 

     // Pick a style based on the num. 
     int style = DialogFragment.STYLE_NORMAL, theme = 0; 
     switch ((mNum-1)%6) { 
      case 1: style = DialogFragment.STYLE_NO_TITLE; break; 
      case 2: style = DialogFragment.STYLE_NO_FRAME; break; 
      case 3: style = DialogFragment.STYLE_NO_INPUT; break; 
      case 4: style = DialogFragment.STYLE_NORMAL; break; 
      case 5: style = DialogFragment.STYLE_NORMAL; break; 
      case 6: style = DialogFragment.STYLE_NO_TITLE; break; 
      case 7: style = DialogFragment.STYLE_NO_FRAME; break; 
      case 8: style = DialogFragment.STYLE_NORMAL; break; 
     } 
     switch ((mNum-1)%6) { 
      case 4: theme = android.R.style.Theme_Holo; break; 
      case 5: theme = android.R.style.Theme_Holo_Light_Dialog; break; 
      case 6: theme = android.R.style.Theme_Holo_Light; break; 
      case 7: theme = android.R.style.Theme_Holo_Light_Panel; break; 
      case 8: theme = android.R.style.Theme_Holo_Light; break; 
     } 
     setStyle(style, theme); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     // put here any view you want 
     View v = inflater.inflate(R.layout.fragment_dialog, container, false); 
     View tv = v.findViewById(R.id.text); 
     ((TextView)tv).setText("Dialog #" + mNum + ": using style " 
       + getNameForNum(mNum)); 

     // Watch for button clicks. 
     Button button = (Button)v.findViewById(R.id.show); 
     button.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       // When button is clicked, call up to owning activity. 
       ((FragmentDialog)getActivity()).showDialog(); 
      } 
     }); 

     return v; 
    } 
} 



void showDialog() { 
    mStackLevel++; 

    // DialogFragment.show() will take care of adding the fragment 
    // in a transaction. We also want to remove any currently showing 
    // dialog, so make our own transaction and take care of that here. 
    FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     // may you got error here 
    Fragment prev = getFragmentManager().findFragmentByTag("dialog"); 
    if (prev != null) { 
    // remove fragment from stack will fix the problem 
     ft.remove(prev); 
    } 
    ft.addToBackStack(null); 

    // Create and show the dialog. 
    DialogFragment newFragment = MyDialogFragment.newInstance(mStackLevel); 
    newFragment.show(ft, "dialog"); 
} 

, если вы хотите использовать его в кнопках оповещения здесь код

public static class MyAlertDialogFragment extends DialogFragment { 

    public static MyAlertDialogFragment newInstance(int title) { 
     MyAlertDialogFragment frag = new MyAlertDialogFragment(); 
     Bundle args = new Bundle(); 
     args.putInt("title", title); 
     frag.setArguments(args); 
     return frag; 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     int title = getArguments().getInt("title"); 

     return new AlertDialog.Builder(getActivity()) 
       .setIcon(R.drawable.alert_dialog_icon) 
       .setTitle(title) 
       .setPositiveButton(R.string.alert_dialog_ok, 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int whichButton) { 
          ((FragmentAlertDialog)getActivity()).doPositiveClick(); 
         } 
        } 
       ) 
       .setNegativeButton(R.string.alert_dialog_cancel, 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int whichButton) { 
          ((FragmentAlertDialog)getActivity()).doNegativeClick(); 
         } 
        } 
       ) 
       .create(); 
    } 
} 
+0

Что делать с кнопками alertdialog? Должен ли я имитировать внешний вид в моем макете? – Kuno

+0

нет, вы можете использовать его так, как вы хотите, прочитайте документацию, вы найдете пример и об этом, я также обновлю ответ для вас. –

+0

Это не сработает. Если вы вставляете DialogFragment, onCreateDialog не будет вызываться. Таким образом, вы можете выбрать контейнер, но не можете иметь собственный alertDialog, или вы можете иметь собственный AlertDialog, но не можете вставлять его в свой макет. Это верно? – Kuno

1

вы можете использовать dialogFragment как обычный фрагмент. взгляните на этот код из образцов. В этом коде он создает один диалогФрагмент и добавляет его в framlayout, а также показывает его как диалог при нажатии кнопки.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:padding="4dip" 
    android:gravity="center_horizontal" 
    android:layout_width="match_parent" android:layout_height="match_parent"> 

    <TextView 
      android:id="@+id/text" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="0" 
      android:layout_gravity="center_vertical|center_horizontal" 
      android:gravity="top|center_horizontal" 
      android:textAppearance="?android:attr/textAppearanceMedium" 
      android:text="Demonstrates the same fragment 
      being shown as a dialog and embedded inside of an activity." /> 

    <Button android:id="@+id/show_dialog" 
     android:layout_width="wrap_content" android:layout_height="wrap_content" 
     android:layout_weight="0" 
     android:text="show"> 
     <requestFocus /> 
    </Button> 

    <View android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" /> 

    <TextView 
      android:id="@+id/inline_text" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="0" 
      android:layout_gravity="center_vertical|center_horizontal" 
      android:textAppearance="?android:attr/textAppearanceMedium" 
      android:text="Fragment embedded inside 
     of the activity:" /> 

    <FrameLayout 
      android:id="@+id/embedded" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="0" 
      android:layout_gravity="center_vertical|center_horizontal" 
      android:padding="6dp" 
      android:background="#ff303030" 
      android:gravity="top|center_horizontal" /> 

</LinearLayout> 

и код Java:

public class FragmentDialogOrActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.fragment_dialog_or_activity); 

     if (savedInstanceState == null) { 
      // First-time init; create fragment to embed in activity. 

      FragmentTransaction ft = getFragmentManager().beginTransaction(); 
      DialogFragment newFragment = MyDialogFragment.newInstance(); 
      ft.add(R.id.embedded, newFragment); 
      ft.commit(); 

     } 

     // Watch for button clicks. 
     Button button = (Button)findViewById(R.id.show_dialog); 
     button.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       showDialog(); 
      } 
     }); 
    } 


    void showDialog() { 
     // Create the fragment and show it as a dialog. 
     DialogFragment newFragment = MyDialogFragment.newInstance(); 
     newFragment.show(getFragmentManager(), "dialog"); 
    } 



    public static class MyDialogFragment extends DialogFragment { 
     static MyDialogFragment newInstance() { 
      return new MyDialogFragment(); 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 
      View v = inflater.inflate(R.layout.hello_world, container, false); 
      View tv = v.findViewById(R.id.text); 
      ((TextView)tv).setText("This is an instance of MyDialogFragment"); 
      return v; 
     } 
    } 

} 

и для вашей ошибки вы можете использовать ниже код:

public static void showMyDialogFragment(FragmentManager fm){ 

    FragmentTransaction ft = fm.beginTransaction(); 
    Fragment prev = fm.findFragmentByTag("MyDialogFragment"); 
    if (prev != null) { 
     ft.remove(prev); 
    } 
    ft.addToBackStack(null); 
    DialogFragment newFragment = MyDialogFragment.newInstance(); 
    newFragment.show(ft, "MyDialogFragment"); 
} 

, как вы заметили, что я изменил имя тега, так что вы можете различать диалог фрагмент и обычный фрагмент, добавленные в ваш макет.

+0

Посмотрите на мое редактирование. Я имею в виду, что он должен выглядеть как alertdialog. Я думаю, что в вашем exmaple у вас есть только один textView. Нет заголовка, никаких кнопок диалога. Если вы скажете DialogFagment.show, вы не сможете выбрать контейнер. Так что это не сработает. – Kuno

+1

, когда я использую 'MyDialogFragment extends DialogFragment', это означает, что это может быть любая вещь, которая вам нравится. вы можете добавить кнопку в макет фрагмента, создать пользовательский заголовок и все, что вы можете себе представить. Это просто ОБРАЗЕЦ, вы можете заменить «R.layout.hello_world» тем, что вам нравится. – mmlooloo

+0

Итак, мне нужно собрать все необходимые стили для моего названия и кнопок, чтобы он выглядел как AlertDialog? – Kuno

Смежные вопросы