SAWJUSTO
SAWJUSTO

Reputation: 369

Android DrawerLayout does not close untill fragment is replaced

I got a problem that DrawerLayout does not close smoothly and it stops in the middle for a while, it totally closes after finish replacing fragment. In coding I close DrawerLayout before replacing fragment (productList class). In productList class, it calls asynctask to get all the product list from server meanwhile running progress bar. Ideally when user clicks menu, DrawerLayout will close at once and productList fragment will be loading all the product list. It seems to me DrawerLayout close event waits for productList's asynctask. Any suggestion greatly appreciated.

public class MainActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener, View.OnClickListener {

    public String tag = "MainActivity";
    Context mContext;

    //User Object
    User user;

    //Control
    TextView txtName, txtPosition, txtLogout;

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

        mContext = this;
        user = Constants.getUser();

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


         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.addDrawerListener(toggle);
         toggle.syncState();

         NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
         //NavigationView Header
         View headerView = navigationView.getHeaderView(0);
         txtName = (TextView) headerView.findViewById(R.id.nav_header_main_name) ;
         txtName.setText(user.getName().toString());
         txtLogout = (TextView) headerView.findViewById(R.id.nav_header_main_logout);
         txtLogout.setOnClickListener(this);
         navigationView.setNavigationItemSelectedListener(this);

        //Add Menu in navigationView
        Menu myMenu = navigationView.getMenu();
        myMenu.clear();
        myMenu.add(0,Integer.parseInt("01"),0,"Product List");



    }

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

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

    //close drawer
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);

    // replace fragment
    int id = item.getItemId();
    FragmentManager fragmentManager = getSupportFragmentManager();
    if(Constants.DEBUG) {
        Toast.makeText(mContext, " Menu Id " + String.valueOf(id), Toast.LENGTH_LONG).show();
    }

    fragmentManager.beginTransaction()
            .replace(R.id.container,new productList())
            .commit();


         return true;
    }
    @Override
    public void onClick(View v) {
        //Log out onclick
        if(v.getId() == R.id.nav_header_main_logout){
            this.finish();
        }

    }

}

Upvotes: 1

Views: 524

Answers (1)

Tofira
Tofira

Reputation: 1634

This probably happens beacuse the Navigation Drawer's animation and the creation of the Fragment happens at the same time. You can solve it by starting your Fragment with a small delay-

handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        // replace fragment
        int id = item.getItemId();
        FragmentManager fragmentManager = getSupportFragmentManager();
        if(Constants.DEBUG) {
            Toast.makeText(mContext, " Menu Id " + String.valueOf(id), Toast.LENGTH_LONG).show();
        }

        fragmentManager.beginTransaction()
                .replace(R.id.container,new productList())
                .commit();
    }
}, 300);

Upvotes: 2

Related Questions