0

我正在構建一個應用程序,其中包含NavigationDrawer來瀏覽片段之間。 出於某種原因,在導航抽屜的項目只是標誌着本身並不改變片段的任何項目時按下(試圖調試,但該項目的點擊不調用函數)fragment不加載片段不會改變後,項目點擊導航抽屜

第一click..i必須按兩次重新加載fragment

主要活動:

public class MainActivity extends AppCompatActivity { 
private NavigationView navigationView; 
private DrawerLayout drawer; 
private View navHeader; 
private ImageView imgNavHeaderBg, imgProfile; 
private TextView txtName, txtCity; 
private Toolbar toolbar; 
private FloatingActionButton fab; 

// urls to load user profile & background 
private static final String urlNavHeaderBg = ""; 
private static final String urlProfileImg = ""; 

//current menu pressed 
public static int navItemIndex = 0; 

//tags for fragments 
private static final String TAG_HOME = "home"; 
private static final String TAG_PROFILE = "profile"; 
private static final String TAG_RATEUS = "rate us"; 
private static final String TAG_SCORE = "rate score"; 
private static final String TAG_NOTIFICATIONS = "notifications"; 
private static final String TAG_SETTINGS = "settings"; 
public static String CURRENT_TAG = TAG_HOME; 

private String[] activityTitles; 
private boolean shouldLoadHomeFragOnBackPress = true; 
private Handler mHandler; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    mHandler = new Handler(); 
    drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    navigationView = (NavigationView) findViewById(R.id.nav_view); 
    fab = (FloatingActionButton) findViewById(R.id.fab); 

    //nav view header 
    navHeader = navigationView.getHeaderView(0); 
    txtName = (TextView) navHeader.findViewById(R.id.name); 
    txtCity = (TextView) navHeader.findViewById(R.id.city); 
    imgNavHeaderBg = (ImageView) navHeader.findViewById(R.id.img_header_bg); 
    imgProfile = (ImageView) navHeader.findViewById(R.id.img_profile); 

    //load the toolbar titles 
    activityTitles = getResources().getStringArray(R.array.nav_item_activity_titles); 

    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Snackbar.make(view, "Make action here", Snackbar.LENGTH_LONG).setAction("Action", null).show(); 
     } 
    }); 

    //load the navigator header data 
    loadNavHeader(); 

    //initialize nav menu 
    setUpNavigationView(); 

    if (savedInstanceState == null) { 
     navItemIndex = 0; 
     CURRENT_TAG = TAG_HOME; 
     loadHomeFragment(); 
    } 
} 

private void loadNavHeader() { 
    txtName.setText("My Name"); 
    txtCity.setText("Somewhere, Europe"); 

    Glide.with(this).load(urlNavHeaderBg).crossFade().diskCacheStrategy(DiskCacheStrategy.ALL).into(imgNavHeaderBg); 
    Glide.with(this).load(urlProfileImg).thumbnail(0.5f).bitmapTransform(new CircleTransform(this)).diskCacheStrategy(DiskCacheStrategy.ALL).into(imgProfile); 

    navigationView.getMenu().getItem(4).setActionView(R.layout.menu_dot); 
} 

private void loadHomeFragment() { 
    selectNavMenu(); 
    setToolBarTitle(); 

    if (getSupportFragmentManager().findFragmentByTag(CURRENT_TAG) != null) { 
     drawer.closeDrawers(); 
     toggleFab(); 
     return; 
    } 
    Runnable mPendingRunnable = new Runnable() { 
     @Override 
     public void run() { 
      Fragment fragment = getHomeFragment(); 
      FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
      fragmentTransaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out); 
      fragmentTransaction.replace(R.id.frame, fragment, CURRENT_TAG); 
      fragmentTransaction.commitAllowingStateLoss(); 
     } 
    }; 
    if (mPendingRunnable != null) { 
     mHandler.post(mPendingRunnable); 
    } 
    toggleFab(); 

    drawer.closeDrawers(); 
    invalidateOptionsMenu(); 
} 

private Fragment getHomeFragment() { 
    switch (navItemIndex) { 
     case 0: 
      HomeFragment homeFragment = new HomeFragment(); 
      return homeFragment; 
     case 1: 
      ProfileFragment profileFragment = new ProfileFragment(); 
      return profileFragment; 
     case 2: 
      RateusFragment rateusFragment = new RateusFragment(); 
      return rateusFragment; 
     case 3: 
      ScoreFragment scoreFragment = new ScoreFragment(); 
      return scoreFragment; 
     case 4: 
      NotificationsFragment notificationsFragment = new NotificationsFragment(); 
      return notificationsFragment; 
     case 5: 
      SettingsFragment settingsFragment = new SettingsFragment(); 
      return settingsFragment; 
     default: 
      return new HomeFragment(); 
    } 
} 

private void setToolBarTitle() { 
    getSupportActionBar().setTitle(activityTitles[navItemIndex]); 
} 

private void selectNavMenu() { 
    navigationView.getMenu().getItem(navItemIndex).setCheckable(true); 
} 

private void setUpNavigationView() { 
    navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { 
     @Override 
     public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) { 
      switch (menuItem.getItemId()) { 
       case R.id.nav_home: 
        navItemIndex = 0; 
        CURRENT_TAG = TAG_HOME; 
        break; 
       case R.id.nav_profile: 
        navItemIndex = 1; 
        CURRENT_TAG = TAG_PROFILE; 
        break; 
       case R.id.nav_rateus: 
        navItemIndex = 2; 
        CURRENT_TAG = TAG_RATEUS; 
        break; 
       case R.id.nav_score: 
        navItemIndex = 3; 
        CURRENT_TAG = TAG_SCORE; 
        break; 
       case R.id.nav_notifications: 
        navItemIndex = 4; 
        CURRENT_TAG = TAG_NOTIFICATIONS; 
        break; 
       case R.id.nav_settings: 
        navItemIndex = 5; 
        CURRENT_TAG = TAG_SETTINGS; 
        break; 
       case R.id.nav_about_us: 
        startActivity(new Intent(MainActivity.this, AboutUsActivity.class)); 
        drawer.closeDrawers(); 
        return true; 
       case R.id.nav_terms: 
        startActivity(new Intent(MainActivity.this, TermsActivity.class)); 
        drawer.closeDrawers(); 
        return true; 
       default: 
        navItemIndex = 0; 
      } 
      if (menuItem.isChecked()) { 
       menuItem.setChecked(false); 
      } else { 
       menuItem.setChecked(true); 
      } 
      menuItem.setChecked(true); 

      return true; 
     } 
    }); 

    ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.openDrawer, R.string.closeDrawer) { 

     @Override 
     public void onDrawerClosed(View drawerView) { 
      //when nav closed this will triggered - leaving blank so nothing won't happen 
      super.onDrawerClosed(drawerView); 
     } 

     @Override 
     public void onDrawerOpened(View drawerView) { 
      //when nav opened this will triggered - leaving blank so nothing won't happen 
      super.onDrawerOpened(drawerView); 
     } 
    }; 
    drawer.addDrawerListener(actionBarDrawerToggle); 
    actionBarDrawerToggle.syncState(); 
} 

@Override 
public void onBackPressed() { 
    if (drawer.isDrawerOpen(GravityCompat.START)) { 
     drawer.closeDrawers(); 
     return; 
    } 
    if (shouldLoadHomeFragOnBackPress) { 
     if (navItemIndex != 0) { 
      navItemIndex = 0; 
      CURRENT_TAG = TAG_HOME; 
      loadHomeFragment(); 
      return; 
     } 
    } 
    super.onBackPressed(); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    if (navItemIndex == 0) { 
     getMenuInflater().inflate(R.menu.main, menu); 
    } 
    if (navItemIndex == 4) { 
     getMenuInflater().inflate(R.menu.notifications, menu); 
    } 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 

    if (id == R.id.action_logout) { 
     Toast.makeText(getApplicationContext(), "Logout user!", Toast.LENGTH_LONG).show(); 
     return true; 
    } 
    if (id == R.id.action_mark_all_read) { 
     Toast.makeText(getApplicationContext(), "All marked as read!", Toast.LENGTH_LONG).show(); 
    } 
    if (id == R.id.action_clear_notifications) { 
     Toast.makeText(getApplicationContext(), "All Cleared!", Toast.LENGTH_LONG).show(); 
    } 
    return super.onOptionsItemSelected(item); 
} 

private void toggleFab() { 
    if (navItemIndex == 0) 
     fab.show(); 
    else 
     fab.hide(); 
} 

}

activity_main.xml中:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:openDrawer="start" 
    tools:context=".activity.MainActivity"> 
<include 
    layout="@layout/app_bar_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

<android.support.design.widget.NavigationView 
    android:id="@+id/nav_view" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:fitsSystemWindows="true" 
    app:headerLayout="@layout/nav_header_main" 
    app:menu="@menu/activity_main_drawer" /> 

回答

1

有幾個有問題的代碼:

確保ü在開關添加突破:

case R.id.nav_about_us: 
    startActivity(new Intent(MainActivity.this, AboutUsActivity.class)); 
    drawer.closeDrawers(); 
    break; //add break 
case R.id.nav_terms: 
    startActivity(new Intent(MainActivity.this, TermsActivity.class)); 
    drawer.closeDrawers(); 
    break; 
default: 
    navItemIndex = 0; 
    break; 

而且您的片段不加載你不是調用該函數正確:

在您的開關情況下:

case R.id.nav_home: 
    navItemIndex = 0; 
    CURRENT_TAG = TAG_HOME; 
    Fragment fragment = getHomeFragment(); //get fragment based on index 
    ReplaceFragment(fragment); //now replace them and load new one 
    drawer.closeDrawers(); 
    break; 

ReplaceFragment方法寫:

public void ReplaceFragment(Fragment r_fragment) { 
    if (r_fragment != null) { 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     fragmentManager.beginTransaction().replace(R.id.frame, r_fragment).commit(); 

    } else { 
     // error in creating fragment 
    } 

} 

而且覆蓋下面的方法:

@Override 
public void onDrawerOpened(View drawerView) { 
    super.onDrawerOpened(drawerView); 
    drawerView.bringToFront(); //add this two lines 
    drawerView.requestLayout(); 
} 

@Override 
    protected void onPostCreate(Bundle savedInstanceState) { 
     super.onPostCreate(savedInstanceState); 
     // Sync the toggle state after onRestoreInstanceState has occurred. 
     actionBarDrawerToggle.syncState(); 
    } 
+0

嘛,我加了功能開關箱裏面 - 它取代了碎片,但只有當我按了兩次。在你的'onOptionsItemSelected'方法中出現 – user3181843

+0

註釋掉'return super.onOptionsItemSelected(item);'並添加'return false;' – rafsanahmad007

+0

嗨, 仍然需要在NavigationDrawer中的每個項目中點擊兩次以更改片段。 以下是onOptionsItemSelected中的更改: // return super.onOptionsItemSelected(item); 返回false; – user3181843