2017-01-16 72 views
0

我正在使用片段刪除應用程序。我的問題是當我按下後退按鈕,從任何屏幕,應用程序關閉。應用程序顯示預期的佈局,但立即關閉。這是我的片段的代碼,他包含一個Button。onBackPressed Android片段

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

問題出在哪裏?我正在閱讀其他人的帖子,但找不到解決方案。由於

+0

我覺得這行有一些問題===> transaction.replace(R.id.container,loginFragment,LOGIN_FRAGMENT).addToBackStack(STATUS);你在哪裏定義了「loginFragment」?糾正我,如果我錯了! – Darsh

+0

公共類MainActivity擴展FragmentActivity實現AccountFragment.OnFragmentInteractionListener, StatusFragment.StatusListener,ObserverModel {0} {0}}}}}}}}}}}} LoginFragment loginFragment = new LoginFragment()final static String LOGIN_FRAGMENT =「Login」; – baldcl

+0

在FragmentActivity中添加super.onBackPressed到else語句並解決您的問題。 –

回答

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

應用程序回來,但然後關閉???應用程序在第一次按下後關閉或什麼? –

+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

我認爲你的條件如果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(); 
    }