1

I have a class named MainActivity.java, this java contains Navigation Bar code.

If I want to build another activity named Contact.java and there also contains Navigation Bar code. How do I reuse Navigation Bar code from MainActivity.java to Contact.java? Can I create a class to solve it?

Here is my code:

package com.thisistap.isuper.www.contactbook;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.TabHost;
import com.thisistap.isuper.www.contactbook.nav.*;

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {
    private Button contact_button;
    private TabHost mTabHost = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // defined elements from layout (it can be modified)
        contact_button = (Button) findViewById(R.id.contact_button);

        // --- [Start] defined elements from Navigation Bar (it cannot be modified from here) ---
        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.setDrawerListener(toggle);
        toggle.syncState();
        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
        // --- [End] defined elements from Navigation Bar (it cannot be modified from here) ---

        // --- [Start] Button Group ---
        contact_button.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent myIntent = new Intent(MainActivity.this,Contact.class);
                MainActivity.this.startActivity(myIntent);
            }
        });
        // --- [End] Button Group ---
    }

    // --- [Start] Navigation Bar Action (it cannot be modified from here) ---
    @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 onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        return super.onOptionsItemSelected(item);
    }
    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();
        if (id == R.id.nav_camera) {
            Intent myIntent = new Intent(MainActivity.this,Contact.class);
            MainActivity.this.startActivity(myIntent);
        } else if (id == R.id.nav_gallery) {

        } else if (id == R.id.nav_slideshow) {

        } else if (id == R.id.nav_manage) {

        } else if (id == R.id.nav_share) {

        } else if (id == R.id.nav_send) {

        }
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }
    // --- [End] Navigation Bar Action (it cannot be modified from here) ---
}
Kaushik NP
  • 6,733
  • 9
  • 31
  • 60
Skylar
  • 11
  • 2

2 Answers2

0

I suggest you extendig your activities from a base activity and implement your common logic into this parent.

anzaidemirzoi
  • 386
  • 4
  • 13
0

Just do this - Take all your drawer code in a BaseActivity and in XML of BaseActivity put DrawerLayout as parent along with a container(like you do it for fragments) and NavigationView. You can also look at this answer. It addresses the same issue.

Then extend BaseActivity to your MainActivity and instead of using setContentView(), inflate it in the container of your BaseActivity.

public class BaseActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {

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


    // --- [Start] defined elements from Navigation Bar (it cannot be modified from here) ---
    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.setDrawerListener(toggle);
    toggle.syncState();
    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
    // --- [End] defined elements from Navigation Bar (it cannot be modified from here) ---

}

// --- [Start] Navigation Bar Action (it cannot be modified from here) ---
@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 onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    return super.onOptionsItemSelected(item);
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    int id = item.getItemId();
    if (id == R.id.nav_camera) {
        Intent myIntent = new Intent(MainActivity.this,Contact.class);
        MainActivity.this.startActivity(myIntent);
    } else if (id == R.id.nav_gallery) {

    } else if (id == R.id.nav_slideshow) {

    } else if (id == R.id.nav_manage) {

    } else if (id == R.id.nav_share) {

    } else if (id == R.id.nav_send) {

    }
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}
// --- [End] Navigation Bar Action (it cannot be modified from here) ---
}

Then extend in your MainActivity -

public class MainActivity extends BaseActivity{

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   FrameLayout containerParent = (FrameLayout) findViewById(R.id.container);
   getLayoutInflater().inflate(R.layout.activity_main, containerParent);

 contact_button = (Button) findViewById(R.id.contact_button);
}
    }

Your BaseActivity XML should be like this -

<DrawerLayout --->
    <FrameLayout ---/>
    <NavigationView-------/>
</DrawerLayout/>
Community
  • 1
  • 1
Imdad
  • 683
  • 1
  • 9
  • 27