Android Open Source - android-drawer-tab Main Activity






From Project

Back to project page android-drawer-tab.

License

The source code is released under:

Apache License

If you think the Android project android-drawer-tab listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * Copyright (C) 2014 ech0s7r //from ww  w. ja v a  2  s .co m
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.echlabsw.android.drawertab;

import java.util.HashMap;
import java.util.LinkedHashMap;

import org.json.JSONObject;

import android.annotation.TargetApi;
import android.app.ActionBar;
import android.content.res.Configuration;
import android.graphics.Point;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.AsyncTaskLoader;
import android.support.v4.content.Loader;
import android.support.v4.view.GravityCompat;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v4.widget.SwipeRefreshLayout;
import android.util.Log;
import android.view.Display;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.HorizontalScrollView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TabHost;
import android.widget.TabHost.TabContentFactory;

public class MainActivity extends FragmentActivity implements
    TabContentFactory, TabHost.OnTabChangeListener,
    ViewPager.OnPageChangeListener, OnItemClickListener,
    ExampleFragment.OnRefreshContentListener, LoaderCallbacks<JSONObject> {

  public static final String TAG = "DrawerTab";

  private DrawerLayout mDrawerLayout;
  private ListView mDrawerListView;
  private ActionBarDrawerToggle mDrawerToggle;

  private ViewPager mViewPager;
  private TabsPagerAdapter mAdapter;
  private ActionBar mActionBar;
  private TabHost mTabHost;

  private HorizontalScrollView mHorizontalTabScrollView;

  private HashMap<String, Tab> mTabMap;

  private int mScrollToX;

  private ListAdapter mArrayNavigationDrawerAdapter;

  private Menu mOptionsMenu;

  private static final boolean TAB_SCROLL_ENABLED = true;

  public static class Tab {
    int index;
    String title;

    Tab(int index, String title) {
      this.index = index;
      this.title = title;
    }

    @Override
    public String toString() {
      return title;
    }
  }

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.i(TAG, "onCreate");

    setContentView(R.layout.activity_main);

    createStubTab();

    mActionBar = getActionBar();

    mHorizontalTabScrollView = (HorizontalScrollView) findViewById(R.id.hscroll_tab_host);

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerListView = (ListView) findViewById(R.id.left_drawer);
    mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow,
        GravityCompat.START);

    mActionBar.setHomeButtonEnabled(true);
    mActionBar.setDisplayHomeAsUpEnabled(true);

    mDrawerToggle = createDrawerToggleListener();

    mDrawerLayout.setDrawerListener(mDrawerToggle);

    mTabHost = (TabHost) findViewById(android.R.id.tabhost);
    mTabHost.setup();

    for (String tag : mTabMap.keySet()) {
      Tab tab = mTabMap.get(tag);
      TabHost.TabSpec spec = mTabHost.newTabSpec(tag);
      spec.setContent(this);
      spec.setIndicator(tab.title);
      mTabHost.addTab(spec);
    }

    mViewPager = (ViewPager) findViewById(R.id.pager);
    mAdapter = new TabsPagerAdapter(getSupportFragmentManager(),
        mTabMap.size());
    mViewPager.setAdapter(mAdapter);

    mTabHost.setOnTabChangedListener(this);
    mViewPager.setOnPageChangeListener(this);

    if (!TAB_SCROLL_ENABLED) {
      mHorizontalTabScrollView.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
          switch (event.getAction()) {
          case MotionEvent.ACTION_DOWN:
            break;
          case MotionEvent.ACTION_UP:
            v.performClick();
            break;
          }
          return true;
        }
      });
    }

    mArrayNavigationDrawerAdapter = new ArrayAdapter<Tab>(this,
        android.R.layout.simple_list_item_1, mTabMap.values().toArray(
            new Tab[0]));
    mDrawerListView.setAdapter(mArrayNavigationDrawerAdapter);
    mDrawerListView.setOnItemClickListener(this);

    /* Create AsyncTaskLoader */
    getSupportLoaderManager().initLoader(0, null, this);
  }

  private void createStubTab() {
    mTabMap = new LinkedHashMap<String, Tab>();
    mTabMap.put("0", new Tab(0, "Tab 0"));
    mTabMap.put("1", new Tab(1, "Tab 1"));
    mTabMap.put("2", new Tab(2, "Tab 2"));
    mTabMap.put("3", new Tab(3, "Tab 3"));
    mTabMap.put("4", new Tab(4, "Tab 4"));
    mTabMap.put("5", new Tab(5, "Tab 5"));
  }

  private ActionBarDrawerToggle createDrawerToggleListener() {
    return new ActionBarDrawerToggle(this, mDrawerLayout,
        R.drawable.ic_drawer, R.string.drawer_open,
        R.string.drawer_close) {

      public void onDrawerClosed(View view) {
        mActionBar.setTitle(getString(R.string.app_name));
        super.onDrawerClosed(view);
      }

      public void onDrawerOpened(View drawerView) {
        // Set the title on the action when drawer open
        mActionBar.setTitle("Title");
        super.onDrawerOpened(drawerView);
      }
    };
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
      if (mDrawerLayout.isDrawerOpen(mDrawerListView)) {
        mDrawerLayout.closeDrawer(mDrawerListView);
      } else {
        mDrawerLayout.openDrawer(mDrawerListView);
      }
    }
    return super.onOptionsItemSelected(item);
  }

  @Override
  protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    mDrawerToggle.syncState();
  }

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

  @Override
  public View createTabContent(String tag) {
    // Stub empty View
    return new View(this);
  }

  @Override
  public void onTabChanged(String tabId) {
    Tab tab = mTabMap.get(tabId);
    selectTab(tab);
  }

  @Override
  public void onPageSelected(int position) {
    mTabHost.setCurrentTab(position);
  }

  @Override
  public void onPageScrolled(int arg0, float arg1, int arg2) {

  }

  @Override
  public void onPageScrollStateChanged(int arg0) {

  }

  @Override
  public void onAttachFragment(Fragment fragment) {
    Log.i(TAG, "onAttachFragment");
    super.onAttachFragment(fragment);
  }

  @Override
  protected void onResume() {
    Log.i(TAG, "onResume");
    super.onResume();

  }

  @Override
  protected void onPostResume() {
    super.onPostResume();
  }

  @TargetApi(13)
  private void centerTabHorizontalScroll() {
    final View currentTabView = mTabHost.getCurrentTabView();
    // int currentTabIndex = mTabHost.getCurrentTab();
    int widthX = getDisplayPxWidth();

    if ((currentTabView.getLeft() + currentTabView.getWidth()) > widthX) {
      mScrollToX = currentTabView.getLeft();

    } else if (currentTabView.getLeft() < (currentTabView.getWidth() + 10)) {
      // 10 maybe margin
      mScrollToX = 0;
    }
    if (mHorizontalTabScrollView != null) {
      mHorizontalTabScrollView.postDelayed(new Runnable() {
        @Override
        public void run() {
          if (mHorizontalTabScrollView != null) {
            mHorizontalTabScrollView.scrollTo(mScrollToX, 0);
          }
        }
      }, 100);
    }
  }

  @TargetApi(13)
  @SuppressWarnings("deprecation")
  private int getDisplayPxWidth() {
    Display display = getWindowManager().getDefaultDisplay();
    if (android.os.Build.VERSION.SDK_INT >= 13) {
      Point size = new Point();
      display.getSize(size);
      return size.x;
    } else {
      return display.getWidth();
    }
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    mOptionsMenu = menu;
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_menu, menu);
    return true;
  }

  @Override
  public void onItemClick(AdapterView<?> parent, View view, int position,
      long id) {
    Tab tab = (Tab) mArrayNavigationDrawerAdapter.getItem(position);
    selectTab(tab);
  }

  private void selectTab(Tab tab) {
    mViewPager.setCurrentItem(tab.index);
    if (mDrawerLayout.isDrawerOpen(mDrawerListView)) {
      mDrawerLayout.closeDrawer(mDrawerListView);
    }

    centerTabHorizontalScroll();
  }

  @Override
  public void onRefreshFragmentContent(final SwipeRefreshLayout swipeLayout) {
    showProgressLoading();
    AsyncTaskLoader<JSONObject> loader = (AsyncTaskLoader<JSONObject>) getSupportLoaderManager()
        .<JSONObject> getLoader(0);
    if (loader != null) {
      loader.stopLoading();
      loader.forceLoad();
    } else {
      Log.e(TAG, "loader is null!");
    }
  }

  private void showProgressLoading() {
    if (mOptionsMenu != null) {
      final MenuItem item = mOptionsMenu.findItem(R.id.action_refresh);
      if (item != null) {
        item.setActionView(R.layout.actionbar_indeterminate_progress);
      }
    }
  }

  private void dismissProgressLoading() {
    SwipeRefreshLayout swipe = (SwipeRefreshLayout) findViewById(R.id.swipe_container);
    if (swipe != null) {
      swipe.setRefreshing(false);
    }
    if (mOptionsMenu != null) {
      MenuItem item = mOptionsMenu.findItem(R.id.action_refresh);
      if (item != null) {
        item.setActionView(null);
      }
    }
  }

  @Override
  public Object onRetainCustomNonConfigurationInstance() {
    Log.i(TAG, "onRetainCustomNonConfigurationInstance");
    return super.onRetainCustomNonConfigurationInstance();
  }

  /**
   * Instantiate and return a new Loader for the given ID.
   */
  @Override
  public Loader<JSONObject> onCreateLoader(int id, Bundle args) {
    Log.i(TAG, "onCreateLoader");
    return new AsyncTaskLoader<JSONObject>(this) {

      Thread loaderThread;

      @Override
      public JSONObject loadInBackground() {
        try {
          loaderThread = Thread.currentThread();
          for (int i = 0; i < 10; i++) {
            Log.i(TAG, "[thread: " + Thread.currentThread().getId()
                + "] loadInBackground: " + i);
            Thread.sleep(1000);
          }
        } catch (Exception e) {
          Log.i(TAG, "Thread " + Thread.currentThread().getId()
              + " interrupted");
        }
        return null;
      }

      @Override
      public void onCanceled(JSONObject data) {
        Log.i(TAG, "onCanceled");
        if (loaderThread != null) {
          loaderThread.interrupt();
        }
        super.onCanceled(data);
      }

      /**
       * Run in UI Thread
       */
      @Override
      protected void onStopLoading() {
        Log.i(TAG, "onStopLoading");
        if (loaderThread != null) {
          loaderThread.interrupt();
        }
        super.onStopLoading();
      }

      @Override
      protected void onAbandon() {
        Log.i(TAG, "onAbandon");
        super.onAbandon();
      }

      @Override
      protected void onReset() {
        Log.i(TAG, "onReset");
        super.onReset();
      }

      @Override
      protected void onStartLoading() {
        super.onStartLoading();
        showProgressLoading();
      }

    };
  }

  /**
   * Called when a previously created loader has finished its load.
   */
  @Override
  public void onLoadFinished(Loader<JSONObject> loader, JSONObject data) {
    Log.i(TAG, "onLoadFinished");
    new Handler().post(new Runnable() {
      @Override
      public void run() {
        dismissProgressLoading();
      }
    });
  }

  /**
   * Called when a previously created loader is being reset, and thus making
   * its data unavailable.
   */
  @Override
  public void onLoaderReset(Loader<JSONObject> loader) {
    Log.i(TAG, "onLoaderReset");
  }

}




Java Source Code List

com.echlabsw.android.drawertab.ExampleFragment.java
com.echlabsw.android.drawertab.ListDrawerAdapter.java
com.echlabsw.android.drawertab.MainActivity.java
com.echlabsw.android.drawertab.TabsPagerAdapter.java