Я хочу реализовать этот исходный код в моем проекте без использования ViewPager
. После реализации этого onBackPressed
не работает на MainActivity
, когда я фиксирую другие Fragment
, но нажатие кнопки приводит к выходу из приложения, и onBackPressed
не работает правильно
MainActivity onBackPressed()
@Override
public void onBackPressed() {
if (!homeFragment.onBackPressed()) {
// container Fragment or its associates couldn't handle the back pressed task
// delegating the task to super class
super.onBackPressed();
} else {
// carousel handled the back pressed task
// do not call super
}
}
Класс MainActivity:
public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.salam);
...
if (savedInstanceState == null) {
initScreen();
} else {
homeFragment = (HomeFragment) getSupportFragmentManager().getFragments().get(0);
}
...
}
private void initScreen() {
// Creating the ViewPager container fragment once
homeFragment = new HomeFragment();
final FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.fragments_container, homeFragment)
.commit();
}
@Override
public void onBackPressed() {
if (!homeFragment.onBackPressed()) {
// container Fragment or its associates couldn't handle the back pressed task
// delegating the task to super class
super.onBackPressed();
} else {
// carousel handled the back pressed task
// do not call super
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
}
Класс HomeFragment:
public class HomeFragment extends Fragment implements View.OnClickListener{
...
private Fragment currentFragment;
SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();
public HomeFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mView = inflater.inflate(R.layout.instagram_post_container, container, false);
//FORCE ATTACH OTHER FRAGMENT
currentFragment = new SampleFragment();
registeredFragments.put(0, currentFragment);
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.addToBackStack(null);
transaction.replace(R.id.root_container, currentFragment).commit();
return mView;
}
public boolean onBackPressed() {
OnBackPressListener thisFragment = (OnBackPressListener) registeredFragments.get(0);
if (currentFragment != null) {
// lets see if the currentFragment or any of its childFragment can handle onBackPressed
return thisFragment.onBackPressed();
}
// this Fragment couldn't handle the onBackPressed call
return false;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
//Bundle arguments = getArguments();
}
}
Класс SampleFragment:
public class SampleFragment extends RootFragment {
...
public SampleFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mView = inflater.inflate(R.layout.fragment_instagram_profile, container, false);
return mView;
}
}
Класс RootFragment:
public class RootFragment extends Fragment implements OnBackPressListener {
@Override
public boolean onBackPressed() {
return new BackPressImpl(this).onBackPressed();
}
}
и затем OnBackPressListener
интерфейс
public interface OnBackPressListener {
boolean onBackPressed();
}
ПРОБЛЕМА
в HomeFragment
thisFragment.onBackPressed()
всегда возвращать false в части кода:
OnBackPressListener thisFragment = (OnBackPressListener) registeredFragments.get(0);
if (currentFragment != null) {
// lets see if the currentFragment or any of its childFragment can handle onBackPressed
return thisFragment.onBackPressed();
}