Я действительно нашел решение своей проблемы.
Основным помощником был 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);
}
}