2016-05-12 3 views
1

Я использую навигационный ящик в своем приложении, каждый элемент в ящике начинает фрагмент. Если фрагмент находится в поле зрения, и нажата кнопка «Назад», я хочу, чтобы активность начала первый фрагмент.Как плавно вернуться к первому фрагменту на обратном пути

разглагольствовать, если я смотрю на AbtFragment или ContaFragment и кнопка назад нажата, я хочу, чтобы начать деятельность или вернуться к HomeFragment.

Часть моей деятельности

public boolean onNavigationItemSelected(MenuItem item) { 
     // Handle navigation view item clicks here. 
     id = item.getItemId(); 

     Fragment fragment = null; 

     if (id == R.id.menu_home) { 
      fragment = new HomeFragment(); 
     } 

     if (id == R.id.about_blog) { 
      fragment = new AbtFragment(); 


     } else if (id == R.id.nav_contri) { 
      fragment = new ContFragment(); 

     } else if (id == R.id.nav_contact) { 
      fragment = new ContaFragment(); 

     } else if (id == R.id.nav_privy) { 
      fragment = new PageFragment(); 

     } else if (id == R.id.nav_advert) { 
      fragment = new PageFragment(); 

     } 

     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right, android.R.anim.slide_in_left, android.R.anim.slide_out_right); 
     ft.replace(R.id.content_frame, fragment, "visible_fragment"); 
     ft.addToBackStack(null); 
     ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
     ft.commit(); 

     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     drawer.closeDrawer(GravityCompat.START); 
     return true; 
    } 

    @Override 
     public void onBackPressed() { 
      DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
      if (drawer.isDrawerOpen(GravityCompat.START)) { 
       drawer.closeDrawer(GravityCompat.START); 
      } else { 
       super.onBackPressed(); 
      } 
      if (getSupportFragmentManager().getBackStackEntryCount() >= 1) { 
       navigationView.setCheckedItem(R.id.menu_home); 
       navigationView.getMenu().performIdentifierAction(R.id.menu_home, 0); 
      } 

     } 

От onBackPressed, я проверка количества фрагмента в backstack, а затем, начиная HomeFragment, если он больше или равен единице, но это не работает должным образом. Например, если я начинаю AbtFragment, а затем ContFragment, и я нажимаю кнопку назад, AbtFragment будет первым мерцание на экране перед HomeFragment будет показано.

Пожалуйста, как это исправить?

Примечание: HomeFragment является frgament по умолчанию, следовательно, он запускается по умолчанию, когда активность запускается.

+0

addToBasckStack(). добавьте HomeFragment ниже вашего кода fragmentManager.replace() –

+0

@ RusheelJain: Я вас не понимаю. – X09

ответ

0

Пример

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { 

NavigationView navigationView = null; 
Toolbar toolbar = null; 
FragmentManager fragmentManager = getSupportFragmentManager(); 

@Override protected void onCreate(Bundle savedInstanceState) { 

super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 

//set initial fragment to 'new' instead 
addFragment(new NewFragment(), true); 

//Set the toolbar 
toolbar = (Toolbar) findViewById(R.id.toolbar); 
setSupportActionBar(toolbar); 

//Set navigation drawer 
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
drawer.setDrawerListener(toggle); 
toggle.syncState(); 
navigationView = (NavigationView) findViewById(R.id.nav_view); 
navigationView.setNavigationItemSelectedListener(this); 
} 

@Override public void onBackPressed() { 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 

    if (drawer.isDrawerOpen(GravityCompat.START)) { 
    drawer.closeDrawer(GravityCompat.START); } 
    else { 
    //put your alert dialog code here // 
    if (getFragmentManager().getBackStackEntryCount() == 0) ... 
    } 
} 

@SuppressWarnings("StatementWithEmptyBody") 
@Override 
public boolean onNavigationItemSelected(MenuItem item) { 

// Handle navigation view item clicks here. 
int id = item.getItemId(); 
// Replace these with your own menu items 
switch (id) { 
    case R.id.nav_start: 
     addFragment(new StartFragment(), true); 
     break; 
    case R.id.nav_save: 
     addFragment(new SaveFragment(), true); 
     break; 
    case R.id.nav_raw: 
     addFragment(new RawFragment(), true); 
     break; 
    case R.id.nav_gyroscope: 
     addFragment(new GyroscopeFragment(), true); 
     break; 
} 

DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
drawer.closeDrawer(GravityCompat.START); 
return true; 
} 

public void addFragment(Fragment fragment, Boolean addToBackStack) { 
    if (fragment != null) { 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    fragmentTransaction.replace(R.id.fragment_container, fragment, fragment.getClass().getSimpleName()) .addToBackStack(null) .commit(); 

    } 
} 
} 
+0

Спасибо, но, пожалуйста, просмотрите мой код еще раз, я использую 'id' not' position', и я не понял, что вы подразумеваете под «где displayView() это вид, который вы хотите видеть» – X09

+0

ok, пожалуйста, проверьте новые изменения – UclidesGil

+0

", а затем вы определяете метод allowBackPressed с логикой, чтобы можно было вернуться назад или нет", не могли бы вы включить эту логику в ответ? – X09

Смежные вопросы