5

У меня есть пользовательский диалог в Android, я создаю диалоговое представление по методу onCreateView.Android DialogFragment не отклоняется

public class FiltroDialog extends DialogFragment { 

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

Когда я пытаюсь закрыть диалоговое окно, у меня есть метод внутри диалога называется с помощью onClickListener

boton.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
          Log.d(TAG,"doDismiss"); 
      FiltroDialog.this.dismiss(); 
     } 
    }); 

Я перекрытая несколько onMethods в диалоговом окне, чтобы увидеть Что происходит с диалогом.

@Override 
public void onDestroyView() { 
    super.onDestroyView(); 
    Log.d(TAG, "onDestroyView"); 
} 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    Log.d(TAG, "onAttach"); 
} 

@Override 
public void onDetach() { 
    super.onDetach(); 
    Log.d(TAG, "onDetach"); 
} 

@Override 
public void onStart() { 
    super.onStart(); 
    Log.d(TAG, "onStart"); 
} 

@Override 
public void onStop() { 
    super.onStop(); 
    Log.d(TAG, "onStop"); 
} 

    @Override 
public void onCancel(DialogInterface dialog) { 
    super.onCancel(dialog); 
    Log.d(TAG,"onCancel"); 
} 

@Override 
public void onDismiss(DialogInterface dialog) { 
    super.onDismiss(dialog); 
    Log.d(TAG,"onDismiss"); 
} 

Я попытался закрыть диалог с помощью функции увольнения(); dismissAllowingStateLoss(); с FragmentTransaction, и каждый раз я получаю тот же результат.

D/FiltroDialog(30492): doDismiss 
D/FiltroDialog(30492): onStop 
D/FiltroDialog(30492): onDestroyView 
D/FiltroDialog(30492): onDetach 

Но диалог это не распространяется исчезнуть с экрана, с помощью кнопки назад, диалоговые правильно, но пропадает с распускать() или метод FragmentTransaction.remove я получить только остановить, DestroyView, Detach, но не onDismiss()

Когда я снова нажмите на кнопку, только это показано в LogCat

D/FiltroDialog(30492): doDismiss 

Я попробовал несколько способов, чтобы закрыть диалоговое окно. Вот код, я использую, чтобы показать диалоговое окно с активности (перестарались из фрагмента)

FiltroDialog newFragment = FiltroDialog.newInstance(); 
newFragment.show(getSupportFragmentManager(), TAG_DLG_FILTROS); 

Вот код, чтобы попытаться закрыть окно от активности (перестарались из фрагмента, такие же результат)

DialogFragment prev = (DialogFragment) getSupportFragmentManager().findFragmentByTag(TAG_DLG_FILTROS); 
if (prev != null) { 
    prev.dismiss();   
} 

Вот еще одну попытку, чтобы попытаться закрыть от активности (перестарались из фрагмента, такой же результат)

Fragment prev = getSupportFragmentManager().findFragmentByTag(TAG_DLG_FILTROS); 
     if (prev != null) { 
      FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
      ft.remove(prev); 
      ft.commit(); 
    } 

Вот еще одну попытку закрыть из диалогового окна, пытаясь вызвать отменить() диалогового окна диалога DialogFragment.

boton.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) {    
      Log.d(TAG,"doDismiss"); 
      FiltroDialog.this.getDialog().cancel(); 
     } 
    }); 

Не отклоняет диалог и не вызывает onDismiss ни Stop, DestroyView, Detach methods.

Вот еще одна попытка закрыть диалоговое окно, пытающееся вызвать метод reject() диалогового окна внутри диалогового окна DialogFragment.

boton.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) {    
      Log.d(TAG,"doDismiss"); 
      FiltroDialog.this.getDialog().dismiss(); 
     } 
    }); 

Не отклоняет диалог и не вызывает onDismiss ни Stop, DestroyView, Detach methods.

У меня есть некоторые диалоги в приложении, и у меня никогда не было этой проблемы, я не совсем новичок в программировании для Android, но я не знаю, что я делаю неправильно? Это ошибка в библиотеке совместимости?

+1

Вы уверены, что вызывается boton.setOnClickListener? – Blackbelt

+0

Да, в onClickListener я поставил вызов Log.d() для обеспечения –

+0

, и если вы попытаетесь уволить его больше раз? – Blackbelt

ответ

0

Хм, не могу понять, почему это не работает, но вы всегда можете сделать getActivity(). OnBackPressed() в качестве временного обходного

+1

Я знаю это, но то, что я ищу, является решением или объяснением, я меняю диалог на Фрагмент, чтобы выполнить тот же результат, но я разрабатываю большое приложение в Android, и эти вещи меня очень пугают. Спасибо за ответ в любом случае. –

4

Я столкнулся с той же проблемой сегодня.

Как вы обрабатываете представления в диалоговом окне? Для меня проблема заключалась в том, что у меня был FrameLayout, в котором я затем раздул представление (на основе некоторой информации).Я не могу сказать, почему это сломало его, но так оно и было. Когда я заменил framelayout простым viewstub, он работал отлично.

Надеюсь, что это сработает. Удачи!

+0

Я в той же ситуации .. что вы подразумеваете под «viewstub»? –

+1

@ GianlucaP. http://developer.android.com/reference/android/view/ViewStub.html – zoltish

+5

Использование '(LayoutInflater) context.getSystemService (Context.LAYOUT_INFLATER_SERVICE)' вместо 'android.support.v4.app.DialogFragment.getLayoutInflater (Bundle) 'просто работает нормально. круто! в javadoc последнего есть также «@hide» в комментариях, поэтому я считаю, что это просто функция, которую нельзя использовать. –

0

Начиная с @zoltish answer я обнаружил, что раздувание представления в содержимом диалога после создания фактического представления создает такие проблемы. В onCreate Я раздувал макет, а затем использовал сообщение, чтобы вызвать объект onViewCreated, где я раздувал еще один макет внутри первого. Решение состоит в том, что вся иерархия компоновки/представления должна быть загружена с onCreate, как минимум, на эмулятор 4.3.

0

Чтобы включить комментарий Джанлука П., в ответ:

кажется, что использование неправильного LayoutInflater может нарушить функциональность распускать. Если вы получаете LayoutInflater от android.support.v4.app.DialogFragment.getLayoutInflater(Bundle), а затем используйте его для раздувания просмотров, увольнение будет нарушено.

Чтобы устранить проблему, используйте вместо этого (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE).

Только одна из этих вещей Android.

0

У меня была такая же проблема, и я переместил ссылку DialogFragment на локальную область метода, которая работала для меня. (Первоначально это было поле моего класса).