0

Ich bin ziemlich neu in Android-Entwicklung. Ich möchte die Navigationsleiste ausblenden, wenn der Benutzer nicht eingeloggt ist. Im Grunde wird das Login-Fragment angezeigt (besser im Vollbildmodus wie Facebook android). Wenn der Benutzer bereits angemeldet ist, wird die Navigationsleiste immer angezeigt.Wie kann man die Navigationsleiste beim Öffnen eines bestimmten Fragments ausblenden?

MainActivity.java

public class MainActivity extends AppCompatActivity { 

private DrawerLayout navDrawerLayout; 
private Toolbar toolbar; 
private ActionBarDrawerToggle navDrawerToggle; 

private SharedPreferences pref; 

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

    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    navDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 

    // Find our drawer view 
    NavigationView navDrawerView = (NavigationView) findViewById(R.id.navdrawer_view); 
    // Setup drawer view 
    setupDrawerContent(navDrawerView); 

    navDrawerToggle = setupDrawerToggle(); 

    pref = getPreferences(0); 
    initFirstFrame(); 
} 

private ActionBarDrawerToggle setupDrawerToggle() { 
    return new ActionBarDrawerToggle(this, navDrawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close); 
} 

private void setupDrawerContent(NavigationView navDrawerView) { 
    navDrawerView.setNavigationItemSelectedListener(
      new NavigationView.OnNavigationItemSelectedListener() { 
       @Override 
       public boolean onNavigationItemSelected(MenuItem menuItem) { 
        selectDrawerItem(menuItem); 
        return true; 
       } 


      }); 
} 

public void selectDrawerItem(MenuItem menuItem) { 
    // Create a new fragment and specify the fragment to show based on nav item clicked 
    Fragment fragment = null; 
    Class fragmentClass; 
    switch(menuItem.getItemId()) { 
     case R.id.events: 
      fragmentClass = EventsFragment.class; 
      break; 
     case R.id.pengumuman: 
      fragmentClass = NewsFragment.class; 
      break; 
     case R.id.edit_profil: 
      fragmentClass = ProfileFragment.class; 
      break; 
     default: 
      fragmentClass = EventsFragment.class; 
    } 

    try { 
     fragment = (Fragment) fragmentClass.newInstance(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    // Insert the fragment by replacing any existing fragment 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    fragmentManager.beginTransaction().replace(R.id.frame_content, fragment).commit(); 

    // Highlight the selected item has been done by NavigationView 
    menuItem.setChecked(true); 
    // Set action bar title 
    setTitle(menuItem.getTitle()); 
    // Close the navigation drawer 
    navDrawerLayout.closeDrawers(); 
} 

private void initFirstFrame(){ 
    Fragment fragment; 
    if(pref.getBoolean(Constants.IS_LOGGED_IN,false)){ 
     fragment = new ProfileFragment(); 
    }else { 
     fragment = new LoginFragment(); 
     // in this login fragment, navdrawer should be invisible, the toolbar too I guess 
    } 

    FragmentManager fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    fragmentTransaction.replace(R.id.frame_content,fragment); 
    fragmentTransaction.commit(); 
} 


@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    return navDrawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item); 
} 

// 'onPostCreate' called when activity start-up is complete after 'onStart()' 
// NOTE! Make sure to override the method with only a single 'Bundle' argument 
@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 
    // Sync the toggle state after onRestoreInstanceState has occurred 
    navDrawerToggle.syncState(); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    // Pass any configuration change to the drawer toggles 
    navDrawerToggle.onConfigurationChanged(newConfig); 
} 

} 
+0

Verwenden Sie eine LoginActivity und die MainActivity, in denen sich die Navigationsleiste befindet und die Anmeldung fehlt. So habe ich es gemacht. – Vucko

+0

@Vucko, wenn ich das getan habe, dann, wie jede eingegebene Daten von Benutzer zu meiner MainActivity zu analysieren? Wie Sie sehen, habe ich ProfileFragment, dieser Benutzer kann E-Mail, Passwort, usw. bearbeiten. Entschuldigung, ich bin Anfänger und weniger Ahnung mit Absicht Sache. – adadion

+0

Sie müssen lernen, vermeiden Sie es nicht, das Zeug auf eine bestimmte Art zu tun, weil Sie mit ihnen nicht vertraut sind. Sie können im Grunde alles online finden. Ich würde vorschlagen, dass Sie online nach einem Lernprogramm zum Anmelden suchen und eine Vorlage im Android-Studio mit dem Namen "Login-Aktivität" suchen und studieren. – Vucko

Antwort

6

eine Schnittstelle definieren sagen DrawerLocker:

interface DrawerLocker{ 
    public void setDrawerLocked(boolean shouldLock); 
} 

diese Schnittstelle in Ihrer Aktivität umzusetzen, die die NavigationDrawer enthält und diese Methode überschreiben.

class YourActivity implements DrawerLocker{ 
. 
. 
public void setDrawerLocked(boolean enabled){ 
    if(enabled){ 
     drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); 
    }else{ 
     drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); 
    } 

} 

Jetzt in Ihrem Fragment des onCreateView, rufen Sie diese Methode wie:

((DrawerLocked)getActivity()).setDrawerLocked(true); 

In Ihrem Fragment des onDestroyView, wieder die Schublade Layout aktivieren:

((DrawerLocked)getActivity()).setDrawerLocked(false); 
+0

Hinweis: Wenn Sie dieses Fragment für eine andere Aktivität verwenden möchten, stellen Sie sicher, dass die Schnittstelle implementiert ist und wenn diese Aktivität keine Navigationsleiste hat, implementieren Sie einfach eine leere Methode – Kushan

+0

Ich habe Fehler bei ((DrawerLocked) getActivity). – adadion

+1

Großartig, das hat es geschafft! vergaß nur die() Funktion haha ​​ – adadion

0

Dieser Code in Aktivität onCreate Verfahren wird Schublade sperren, wenn Sie mehr als ein Fragment im Stapel haben:

getSupportFragmentManager().addOnBackStackChangedListener(() -> { 
     if (getSupportFragmentManager().getBackStackEntryCount() > 0) { 
      mViewHolder.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); 
     } else { 
      mViewHolder.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); 
     } 
    });