2017-01-16 4 views
0

Я деляю приложение с фрагментом. Моя проблема в том, что когда я нажал кнопку «Назад», с любого экрана приложение закрывается. Приложение отображает ожидаемый макет, но немедленно закрывается. Это код моего фрагмента, который включает кнопку.onBackPressed Андроид

public class LoginFragment extends android.support.v4.app.Fragment implements View.OnClickListener, OnBackPressed{ 

    private StatusFragment.StatusListener statusListener; 
    public static LoginFragment newInstance() {return new LoginFragment();} 

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


     View layout = inflater.inflate(R.layout.fragment_login, container, false); //este fragment_profile se muestra 

     Button go_login=(Button)layout.findViewById(R.id.button_gologin); 
     go_login.setOnClickListener(this); 

     Button go_registration=(Button)layout.findViewById(R.id.button_goregistration); 
     go_registration.setOnClickListener(this); 

     return layout; 
    } 
    @Override 
    public void onBackPressed() { 
     //on Back Pressed 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     statusListener = null; 
    } 

    @Override 
    public void onClick(View v) 
    { 
     switch (v.getId()){ 
      case R.id.button_gologin:{ 
       Model model=(Model)getActivity().getApplicationContext(); 
       EditText text_log = (EditText)getActivity().findViewById(R.id.editText_user); 
       EditText text_pass = (EditText)getActivity().findViewById(R.id.editText_pass); 

       model.sendLogin(text_log.getText().toString(),text_pass.getText().toString()); 
       model.isPasswordCorrect(); 
       break; 
      } 

Тогда мы имеем MainActivity

public class MainActivity extends FragmentActivity implements AccountFragment.OnFragmentInteractionListener, 
     StatusFragment.StatusListener, ObserverModel { 

} 

private void showLogin() { 
    LoginFragment fragment = (LoginFragment) fragmentManager.findFragmentByTag(LOGIN_FRAGMENT); 
    if (fragment == null) { 

     Log.d(TAG, "Открываем статус"); 
    } else { 
     Log.d(TAG, "Статус открыт"); 
    } 

    android.support.v4.app.FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
    transaction.replace(R.id.container, loginFragment, LOGIN_FRAGMENT).addToBackStack(STATUS); 
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 
    transaction.addToBackStack(null); 
    transaction.commit(); 
} 



@Override 
     public void onBackPressed() { 
      Fragment currentFragment = getSupportFragmentManager().getFragments().get(getSupportFragmentManager().getBackStackEntryCount() - 1); 
      if (currentFragment instanceof OnBackPressed) { 
       ((OnBackPressed) currentFragment).onBackPressed(); 
      } else { 
      super.onBackPressed(); 
       } 
      } 

Где проблема? Я читал других, пишущих similars, но не могу найти для этого решения. Благодаря

+0

я думаю, что некоторые проблемы с этой строки ===> transaction.replace (R.id.container, loginFragment, LOGIN_FRAGMENT) .addToBackStack (STATUS); где вы определили «loginFragment» ??? Исправьте меня, если я ошибаюсь! – Darsh

+0

общественного класса MainActivity расширяет FragmentActivity реализует AccountFragment.OnFragmentInteractionListener, StatusFragment.StatusListener, ObserverModel { LoginFragment loginFragment = новый LoginFragment() окончательный статическую строку LOGIN_FRAGMENT = "Войти"; – baldcl

+0

Добавить super.onBackНаписано в else в FragmentActivity, и ваша проблема решена. –

ответ

0

Помещенный ниже метод в классе LoginFragment:

public boolean onBackPressed() { 
    return false; 
} 

Помещенный ниже метод в классе MainActivity:

@Override 
public void onBackPressed() { 
    boolean eventConsumed = false; 
    List<Fragment> fragments = getSupportFragmentManager().getFragments(); 
    if (fragments != null) { 
     for (Fragment fragment : fragments) { 
      if (fragment instanceof BaseFragment) { 
       eventConsumed = eventConsumed 
         || ((BaseFragment) fragment).onBackPressed(); 
      } 
     } 
    } 
    if (!eventConsumed) { 
     super.onBackPressed(); 
    } 
} 

Попробуйте этот код.

+0

приложение продолжает падать после нажатия кнопки «Назад» из любого фрагмента на экране – baldcl

+0

Попробуйте этот код. @Override public void onBackPressed() { super.onBackPressed(); fragment.backButtonWasPressed(); } –

+0

См. Мой отредактированный ответ и попробуйте это .. –

2

В вашей деятельности, использовать это в onBackPressed метод:

@Override 
public void onBackPressed() { 
    if (fragment != null && fragment.getChildFragmentManager().getBackStackEntryCount() > 0){ 
     fragment.getChildFragmentManager().popBackStack(); 
    }else { 
     super.onBackPressed(); 
    } 
} 

Добавить

В вашем showLogin метод:

Fragment fragment = new LoginFragment(); 
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
fragmentTransaction.replace(R.id.container,fragment); 
fragmentTransaction.addToBackStack(null); 
fragmentTransaction.commit(); 
+0

ничего, приложение назад, но затем закрыть – baldcl

+0

App обратно, но потом закрыть ??? Приложение закрывается после первого обратного пресса или что? –

+0

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

0

попробовать этот код:

@Override 
    public void onBackPressed() { 
     Fragment currentFragment = getSupportFragmentManager().getFragments().get(getSupportFragmentManager().getBackStackEntryCount() - 1); 
     if (currentFragment instanceof OnBackPressed) { 
      ((OnBackPressed) currentFragment).onBackPressed(); 
      return; 
     } 
     super.onBackPressed(); 
    } 
+0

ничего, приложение назад, но затем закрыть – baldcl

+0

Я думаю, что ваше условие if на MainActivity не работает. Проверьте правильность использования интерфейса OnBackPressed. например: OnBackPressed backPressed = new LoginFragment(); – Noorul

+0

Я удалил «если», но тот же результат, продолжаю падать после нажатия «назад» – baldcl

0

Используйте этот способ, создайте один интерфейс.

public interface IOnBackPressed { 

    boolean onBackPressed(); 

} 

Создание на FragmentBackHelper класса

import android.support.v4.app.Fragment; 

public class FragmentBackHelper extends Fragment implements IOnBackPressed { 

    @Override 
    public boolean onBackPressed() { 
     return true; 
    } 
} 

Тогда из вашего фрагмента класса вызовите этот метод.

@Override 
    public boolean onBackPressed() { 
     if (fragment != null && fragment.getChildFragmentManager().getBackStackEntryCount() > 0){ 
     fragment.getChildFragmentManager().popBackStack()) 

     return super.onBackPressed(); 
    }