2017-01-16 80 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(); 
    }