2017-01-16 7 views
0

Ich bin eine Anwendung mit Fragment delevoping. Mein Problem ist, wenn ich die Zurück-Taste, von jedem Bildschirm aus, die App schließt. Die App zeigt das erwartete Layout an, schließt sich aber sofort. Dies ist der Code meines Fragments, der einen Button enthält.onBackPressed Android-Fragmente

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; 
      } 

Dann haben wir die 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(); 
       } 
      } 

Wo liegt das Problem? Ich habe andere nach ähnlichen Artikeln gelesen, kann aber keine Lösung dafür finden. Dank

+0

Ich denke, einige Probleme mit dieser Linie ===> transaction.replace (R.id.container, loginFragment, LOGIN_FRAGMENT) .addToBackStack (STATUS); wo hast du "loginFragment" definiert ??? Korrigiere mich, wenn ich falsch liege! – Darsh

+0

public class MainActivity erstreckt FragmentActivity implementiert AccountFragment.OnFragmentInteractionListener, StatusFragment.StatusListener, ObserverModel { LoginFragment loginFragment = new LoginFragment() final static String LOGIN_FRAGMENT = "Login"; – baldcl

+0

fügen Sie super.onBackPressed zur else-Anweisung in FragmentActivity hinzu, und Ihr Problem ist behoben. –

Antwort

0

unten Methode Put in LoginFragment Klasse:

public boolean onBackPressed() { 
    return false; 
} 

unten Methode in MainActivity Klasse Put:

@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(); 
    } 
} 

diesen Code Versuchen.

+0

App weiter fallen nach Drücken der "Zurück-Taste" von einem beliebigen Fragment auf dem Bildschirm – baldcl

+0

Versuchen Sie diesen Code. @Override public void onBackPressed() { super.onBackPressed(); fragment.backButtonWasPressed(); } –

+0

Sehen Sie meine bearbeitete Antwort und versuchen Sie dies .. –

2

in Ihrer Tätigkeit, verwenden Sie diese in onBackPressed Methode:

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

In Ihrem showLogin Methode hinzufügen:

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

nichts, App zurück, aber dann schließen – baldcl

+0

App zurück, aber dann schließen ??? App nach dem ersten Zurück drücken oder was? –

+0

ja, ich kann differents Bildschirm gehen, aber wenn ich versuche, zurück zu gehen, zeigt es den gewünschten Bildschirm, aber sofort schließen – baldcl

0

diesen Code versuchen:

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

nichts, app zurück, aber dann schließen – baldcl

+0

ich denke, wenn Ihre Bedingung auf MainActivity nicht funktioniert. Überprüfen Sie, ob Sie ordnungsgemäß arbeiten Verwenden Sie die OnBackPressed-Schnittstelle. zB: OnBackPressed backPressed = new LoginFragment(); – Noorul

+0

Ich löschte das "wenn", aber das gleiche Ergebnis, weiter fallen nach Drücken der "Zurück-Taste" – baldcl

0

Auf diese Weise können Sie eine Schnittstelle erstellen.

public interface IOnBackPressed { 

    boolean onBackPressed(); 

} 

erstellen auf FragmentBackHelper Klasse

import android.support.v4.app.Fragment; 

public class FragmentBackHelper extends Fragment implements IOnBackPressed { 

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

dann von Ihrem Fragment Klasse diese Methode aufrufen.

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

     return super.onBackPressed(); 
    }