Сравнение фрагмента в FrameLayout с другим фрагментом - PullRequest
0 голосов
/ 26 августа 2018

У меня есть приложение с навигацией снизу, которое переключается между тремя фрагментами.Я добавил переход, когда щелкаю по пункту меню, и хотел бы иметь возможность настраивать их больше, чтобы при переходе от левого элемента ( navigation_sync ) вправо ( navigation_message или navigation_settings ) переход идет справа налево и наоборот.Я придумал сравнивать содержимое моего FrameLayout с фрагментом, который я хочу изменить с помощью коммутатора, но я не знаю, как на самом деле это сделать.

SelectActivity.java

import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;
import android.widget.FrameLayout;

public class SelectActivity extends AppCompatActivity {

private BottomNavigationView mMainNavigation;
private FrameLayout mMainFrame;
private SyncFragment syncFragment;
private MessageFragment messageFragment;
private SettingsFragment settingsFragment;
int toFragment;

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_select);
    mMainFrame = (FrameLayout) findViewById(R.id.mainFrame);
    mMainNavigation = (BottomNavigationView) findViewById(R.id.navigation);

    syncFragment = new SyncFragment();
    messageFragment = new MessageFragment();
    settingsFragment = new SettingsFragment();

    setFragment(syncFragment);

    mMainNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch(item.getItemId()) {
                case R.id.navigation_sync:
                    setFragment(syncFragment);
                    toFragment = R.id.navigation_sync;
                    return true;
                case R.id.navigation_message:
                    setFragment(messageFragment);
                    toFragment = R.id.navigation_message;
                    return true;
                case R.id.navigation_settings:
                    setFragment(settingsFragment);
                    toFragment = R.id.navigation_settings;
                    return true;
                default:
                    return false;
            }
        }

    });
}
    private void setFragment(Fragment fragment) {
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    switch(R.id.mainFrame) {
        case R.id.navigation_sync:
            fragmentTransaction.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left);
        case R.id.navigation_message:
            if(toFragment == R.id.navigation_sync) {
                fragmentTransaction.setCustomAnimations(R.anim.enter_from_left, R.anim.exit_to_right);
            } else {
                fragmentTransaction.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left);
            }
        case R.id.navigation_settings:
            fragmentTransaction.setCustomAnimations(R.anim.enter_from_left, R.anim.exit_to_right);
    }
    //fragmentTransaction.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left);
    fragmentTransaction.replace (R.id.mainFrame, fragment);
    fragmentTransaction.commit();
}
}

Это не читает ни один из фрагментTransaction.setCustomAnimations , так что я думаю, что я сравниваю плохие значения?Пожалуйста, помогите!

1 Ответ

0 голосов
/ 27 августа 2018

Я действительно нашел решение своей проблемы.

Основным помощником был Log.d(TAG, "Message");.Благодаря этому я смог проверить, что на самом деле содержит navigation_sync, syncFragment и моя переменная toFragment, и тогда все было просто.Я обнаружил, что syncFragment и другие объекты содержат идентификатор фрагмента, и мне просто нужно было сравнить его с идентификатором фрагмента, который был в настоящее время в FrameLayout.Это можно сделать с помощью этого метода:

public Fragment getFragmentId(){
    return getSupportFragmentManager().findFragmentById(R.id.mainFrame);
}

Итак, я включил это в свой переключатель:

...
switch(getFragmentId()) {
    case syncFragment:
...

И я получил сообщение об ошибке:

Требуется постоянное выражение

, которое я обнаружил здесь можно решить путем преобразования структуры switch в if - else, которую я сделал, и она работает.

Вот полный код для любого, кто может столкнуться с этим.Обратите внимание, что мне пришлось изменить переменную toFragment на переменную Fragment.Также важен порядок, в котором я устанавливаю операторы в switch в onNavigationItemSelected.

import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.MenuItem;
import android.widget.FrameLayout;

public class SelectActivity extends AppCompatActivity {

private static final String TAG = "SelectActivity";
private BottomNavigationView mMainNavigation;
private FrameLayout mMainFrame;
private SyncFragment syncFragment;
private MessageFragment messageFragment;
private SettingsFragment settingsFragment;
private Fragment toFragment;

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_select);
    mMainFrame = (FrameLayout) findViewById(R.id.mainFrame);
    mMainNavigation = (BottomNavigationView) findViewById(R.id.navigation);

    syncFragment = new SyncFragment();
    messageFragment = new MessageFragment();
    settingsFragment = new SettingsFragment();

    setFragment(syncFragment);
    toFragment = syncFragment;

    mMainNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch(item.getItemId()) {
                case R.id.navigation_sync:
                    toFragment = syncFragment;
                    setFragment(syncFragment);
                    return true;
                case R.id.navigation_message:
                    setFragment(messageFragment);
                    return true;
                case R.id.navigation_settings:
                    toFragment = settingsFragment;
                    setFragment(settingsFragment);
                    return true;
                default:
                    return false;
            }
        }
    });
}
private void setFragment(Fragment fragment) {
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    if (getFragmentId() == syncFragment) {
        fragmentTransaction.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left);
    }
    if (getFragmentId()==messageFragment) {
        if(toFragment == syncFragment) {
            fragmentTransaction.setCustomAnimations(R.anim.enter_from_left, R.anim.exit_to_right);
        } else {
            fragmentTransaction.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left);
        }
    }
    if (getFragmentId() == settingsFragment) {
        fragmentTransaction.setCustomAnimations(R.anim.enter_from_left, R.anim.exit_to_right);
    }
    fragmentTransaction.replace (R.id.mainFrame, fragment);
    fragmentTransaction.commit();
}

public Fragment getFragmentId(){
    return getSupportFragmentManager().findFragmentById(R.id.mainFrame);
}
}
...