Реализация вложенного фрагмента с помощью функции onBackPressed - PullRequest
0 голосов
/ 18 января 2019

Я хочу реализовать этот исходный код в моем проекте без использования 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();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...