2016-02-06 3 views
0

Я создаю страницу поиска для приложения для Android. Я хочу добавить некоторые фильтры для поиска в какой-то модальности, и предложения в Интернете говорят, что я должен использовать AlertDialog с фрагментом, чтобы показывать свои настраиваемые фильтры. Мне удалось отобразить фрагмент в диалоговом окне, но код, связанный с фрагментом, например, onCreate, не вызывается. Когда я использую фрагмент непосредственно в действии, его вызов onCreate вызывается, но не когда он загружается с помощью AlertDialog. Есть ли что-то, что я делаю неправильно, или я должен делать это по-другому?Android Fragment в диалоговом окне предупреждения

Это код, который используется, чтобы открыть диалоговый

SearchFilterDialogFragment dialog = new SearchFilterDialogFragment(); 
      FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); 
      Fragment prev = getFragmentManager().findFragmentByTag("dialog"); 
      if (prev != null) { 
       fragmentTransaction.remove(prev); 
      } 
      fragmentTransaction.addToBackStack(null); 
      dialog.show(fragmentTransaction,"dialog"); 

Это код для диалоговой конфигурации

public class SearchFilterDialogFragment extends DialogFragment { 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 

    // Use the Builder class for convenient dialog construction 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    LayoutInflater inflater = getActivity().getLayoutInflater(); 

    builder.setView(inflater.inflate(R.layout.fragment_blank,null)).setTitle("Search Filters") 
      .setPositiveButton(R.string.filter_dialogue_ok, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        // FIRE ZE MISSILES! 
       } 
      }) 
      .setNegativeButton(R.string.filter_dialogue_cancel, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        // User cancelled the dialog 
       } 
      }); 

    return builder.create(); 



} 

Это фрагмент теста, который будет в конечном счете фактических фильтров в нем

public class BlankFragment extends Fragment { 



public BlankFragment() { 
    // Required empty public constructor 
} 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    return inflater.inflate(R.layout.fragment_blank, container, false); 
} 

ответ

1

DialogFragment Фрагмент. Он управляет жизненным циклом фрагмента. Все, что вы хотите внутри BlankFragment, должно находиться внутри SearchFilterDialogFragment. Вам не нужен BlankFragment.

Чтобы ответить на вопрос о том, почему код Бланк-Фрагмента не вызван, , это потому, что ничего не упоминается и не создается экземпляр BlankFragment. Код:

builder.setView(inflater.inflate(R.layout.fragment_blank,null)) 

Надувает макет fragment_blank в DialogFragment, но это не код запуска BlankFragment.

Правильное использование DialogFragment с пользовательскими setView:

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    //Set all the title, button etc. for the AlertDialog 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    builder.setTitle("Search Filters"); 

    //Get LayoutInflater 
    LayoutInflater inflater = getActivity().getLayoutInflater(); 

    //Inflate the layout but ALSO store the returned view to allow us to call findViewById 
    View view = inflater.inflate(R.layout.fragment_blank,null); 

    //Do all the initial code regarding the view, as you would in onCreate normally 
    view.findViewById(R.id.some_view); 

    //Finally, give the custom view to the AlertDialog builder 
    builder.setView(view); 
} 
+0

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

+0

http://developer.android.com/reference/android/app/DialogFragment.html#DialogOrEmbed Вам понадобится контейнерный вид, добавленный в ваш макет, и программно определить, является ли это планшетом. Затем вставьте, если планшет, или покажите как диалог, если нет. –

+0

Итак, фрагмент diallog - это всего лишь фрагмент, который можно отобразить в виде диалога, если вы хотите? –

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