/* * Copyright 2013 Peng fei Pan * * 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 me.xiaopan.sketchsample.activity; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.format.Formatter; import android.util.TypedValue; import android.view.Gravity; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import android.widget.Toast; import org.greenrobot.eventbus.EventBus; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import me.xiaopan.androidinjector.InjectContentView; import me.xiaopan.androidinjector.InjectParentMember; import me.xiaopan.androidinjector.InjectView; import me.xiaopan.assemblyadapter.AssemblyRecyclerAdapter; import me.xiaopan.psts.PagerSlidingTabStrip; import me.xiaopan.sketch.Sketch; import me.xiaopan.sketch.cache.BitmapPool; import me.xiaopan.sketch.cache.DiskCache; import me.xiaopan.sketch.cache.MemoryCache; import me.xiaopan.sketch.util.SketchUtils; import me.xiaopan.sketchsample.BuildConfig; import me.xiaopan.sketchsample.ImageOptions; import me.xiaopan.sketchsample.MyBaseActivity; import me.xiaopan.sketchsample.NotificationService; import me.xiaopan.sketchsample.R; import me.xiaopan.sketchsample.adapter.itemfactory.CheckMenuItemFactory; import me.xiaopan.sketchsample.adapter.itemfactory.InfoMenuItemFactory; import me.xiaopan.sketchsample.adapter.itemfactory.MenuTitleItemFactory; import me.xiaopan.sketchsample.adapter.itemfactory.PageMenuItemFactory; import me.xiaopan.sketchsample.bean.CheckMenu; import me.xiaopan.sketchsample.bean.InfoMenu; import me.xiaopan.sketchsample.fragment.AboutFragment; import me.xiaopan.sketchsample.fragment.AppListFragment; import me.xiaopan.sketchsample.fragment.ImageProcessorTestFragment; import me.xiaopan.sketchsample.fragment.ImageShaperTestFragment; import me.xiaopan.sketchsample.fragment.InBitmapTestFragment; import me.xiaopan.sketchsample.fragment.LargeImageTestFragment; import me.xiaopan.sketchsample.fragment.OtherTestFragment; import me.xiaopan.sketchsample.fragment.PhotoAlbumFragment; import me.xiaopan.sketchsample.fragment.RepeatLoadOrDownloadTestFragment; import me.xiaopan.sketchsample.fragment.SearchFragment; import me.xiaopan.sketchsample.fragment.StarIndexFragment; import me.xiaopan.sketchsample.util.AnimationUtils; import me.xiaopan.sketchsample.util.DeviceUtils; import me.xiaopan.sketchsample.util.Settings; import me.xiaopan.sketchsample.widget.MyImageView; /** * 首页 */ @InjectParentMember @InjectContentView(R.layout.activity_main) public class MainActivity extends MyBaseActivity implements StarIndexFragment.GetStarTagStripListener, AppListFragment.GetAppListTagStripListener, AboutFragment.TogglePageListener, ApplyBackgroundCallback { @InjectView(R.id.layout_main_content) private View contentView; @InjectView(R.id.tabStrip_main_star) private PagerSlidingTabStrip starTabStrip; @InjectView(R.id.tabStrip_main_appList) private PagerSlidingTabStrip appListTabStrip; @InjectView(R.id.drawer_main_content) private DrawerLayout drawerLayout; @InjectView(R.id.recycler_main_menu) private RecyclerView menuRecyclerView; @InjectView(R.id.layout_main_leftMenu) private ViewGroup leftMenuView; @InjectView(R.id.image_main_background) private MyImageView backgroundImageView; @InjectView(R.id.image_main_menuBackground) private MyImageView menuBackgroundImageView; private long lastClickBackTime; private Page page; private ActionBarDrawerToggle toggleDrawable; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initViews(); startService(new Intent(getBaseContext(), NotificationService.class)); switchPage(BuildConfig.DEBUG ? Page.IMAGE_PROCESSOR_TEST : Page.LARGE_IMAGE); } private void initViews() { ViewGroup.LayoutParams layoutParams = backgroundImageView.getLayoutParams(); layoutParams.width = getResources().getDisplayMetrics().widthPixels; layoutParams.height = getResources().getDisplayMetrics().heightPixels; backgroundImageView.setLayoutParams(layoutParams); backgroundImageView.setOptionsByName(ImageOptions.WINDOW_BACKGROUND); backgroundImageView.setAutoApplyGlobalAttr(false); layoutParams = menuBackgroundImageView.getLayoutParams(); layoutParams.width = getResources().getDisplayMetrics().widthPixels; layoutParams.height = getResources().getDisplayMetrics().heightPixels; menuBackgroundImageView.setLayoutParams(layoutParams); menuBackgroundImageView.setOptionsByName(ImageOptions.WINDOW_BACKGROUND); menuBackgroundImageView.getOptions().setImageDisplayer(null); menuBackgroundImageView.setAutoApplyGlobalAttr(false); drawerLayout.setDrawerShadow(R.drawable.shape_drawer_shadow_down_left, Gravity.LEFT); // 设置左侧菜单的宽度为屏幕的一半 ViewGroup.LayoutParams params = leftMenuView.getLayoutParams(); params.width = (int) (getResources().getDisplayMetrics().widthPixels * 0.7); leftMenuView.setLayoutParams(params); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); toggleDrawable = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close); starTabStrip.setTabViewFactory(new TitleTabFactory(new String[]{"最热", "名录"}, getBaseContext())); appListTabStrip.setTabViewFactory(new TitleTabFactory(new String[]{"已安装", "安装包"}, getBaseContext())); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { int statusBarHeight = DeviceUtils.getStatusBarHeight(getResources()); if (statusBarHeight > 0) { contentView.setPadding(contentView.getPaddingLeft(), statusBarHeight, contentView.getPaddingRight(), contentView.getPaddingBottom()); menuRecyclerView.setPadding(contentView.getPaddingLeft(), statusBarHeight, contentView.getPaddingRight(), contentView.getPaddingBottom()); } else { drawerLayout.setFitsSystemWindows(true); } } drawerLayout.setDrawerListener(new DrawerLayout.DrawerListener() { @Override public void onDrawerSlide(View drawerView, float slideOffset) { toggleDrawable.onDrawerSlide(drawerView, slideOffset); } @Override public void onDrawerOpened(View drawerView) { toggleDrawable.onDrawerOpened(drawerView); menuRecyclerView.getAdapter().notifyDataSetChanged(); } @Override public void onDrawerClosed(View drawerView) { toggleDrawable.onDrawerClosed(drawerView); } @Override public void onDrawerStateChanged(int newState) { } }); List<Object> menuList = new ArrayList<Object>(); final View.OnClickListener menuClickListener = new View.OnClickListener() { @Override public void onClick(View v) { drawerLayout.closeDrawer(Gravity.LEFT); } }; menuList.add("综合页面"); for (Page page : Page.getNormalPage()) { if (!page.isDisable()) { menuList.add(page); } } menuList.add("测试页面"); for (Page page : Page.getTestPage()) { if (!page.isDisable()) { menuList.add(page); } } menuList.add("缓存"); menuList.add(new InfoMenu("内存缓存(点击清空)") { @Override public String getInfo() { MemoryCache memoryCache = Sketch.with(getBaseContext()).getConfiguration().getMemoryCache(); String usedSizeFormat = Formatter.formatFileSize(getBaseContext(), memoryCache.getSize()); String maxSizeFormat = Formatter.formatFileSize(getBaseContext(), memoryCache.getMaxSize()); return usedSizeFormat + "/" + maxSizeFormat; } @Override public void onClick(AssemblyRecyclerAdapter adapter) { Sketch.with(getBaseContext()).getConfiguration().getMemoryCache().clear(); menuClickListener.onClick(null); adapter.notifyDataSetChanged(); } }); menuList.add(new InfoMenu("BitmapPool(点击清空)") { @Override public String getInfo() { BitmapPool bitmapPool = Sketch.with(getBaseContext()).getConfiguration().getBitmapPool(); String usedSizeFormat = Formatter.formatFileSize(getBaseContext(), bitmapPool.getSize()); String maxSizeFormat = Formatter.formatFileSize(getBaseContext(), bitmapPool.getMaxSize()); return usedSizeFormat + "/" + maxSizeFormat; } @Override public void onClick(AssemblyRecyclerAdapter adapter) { Sketch.with(getBaseContext()).getConfiguration().getBitmapPool().clear(); menuClickListener.onClick(null); adapter.notifyDataSetChanged(); } }); menuList.add(new InfoMenu("磁盘缓存(点击清空)") { @Override public String getInfo() { DiskCache diskCache = Sketch.with(getBaseContext()).getConfiguration().getDiskCache(); String usedSizeFormat = Formatter.formatFileSize(getBaseContext(), diskCache.getSize()); String maxSizeFormat = Formatter.formatFileSize(getBaseContext(), diskCache.getMaxSize()); return usedSizeFormat + "/" + maxSizeFormat; } @Override public void onClick(final AssemblyRecyclerAdapter adapter) { new AsyncTask<Integer, Integer, Integer>() { @Override protected Integer doInBackground(Integer... params) { Sketch.with(getBaseContext()).getConfiguration().getDiskCache().clear(); return null; } @Override protected void onPostExecute(Integer integer) { super.onPostExecute(integer); menuClickListener.onClick(null); adapter.notifyDataSetChanged(); } }.execute(0); } }); menuList.add(new CheckMenu(this, "全局禁用内存缓存", Settings.PREFERENCE_GLOBAL_DISABLE_CACHE_IN_MEMORY, null, menuClickListener)); menuList.add(new CheckMenu(this, "全局禁用BitmapPool", Settings.PREFERENCE_GLOBAL_DISABLE_BITMAP_POOL, null, menuClickListener)); menuList.add(new CheckMenu(this, "全局禁用磁盘缓存", Settings.PREFERENCE_GLOBAL_DISABLE_CACHE_IN_DISK, null, menuClickListener)); menuList.add("手势缩放"); menuList.add(new CheckMenu(this, "开启手势缩放", Settings.PREFERENCE_SUPPORT_ZOOM, new CheckMenu.OnCheckedChangedListener() { @Override public void onCheckedChanged(boolean checked) { EventBus.getDefault().post(Settings.PREFERENCE_SUPPORT_ZOOM); } }, menuClickListener)); menuList.add(new CheckMenu(this, "开启阅读模式", Settings.PREFERENCE_READ_MODE, new CheckMenu.OnCheckedChangedListener() { @Override public void onCheckedChanged(boolean checked) { EventBus.getDefault().post(Settings.PREFERENCE_READ_MODE); } }, menuClickListener)); menuList.add(new CheckMenu(this, "定位时显示动画", Settings.PREFERENCE_LOCATION_ANIMATE, null, menuClickListener)); menuList.add("分块显示超大图"); menuList.add(new CheckMenu(this, "开启分块显示超大图", Settings.PREFERENCE_SUPPORT_LARGE_IMAGE, new CheckMenu.OnCheckedChangedListener() { @Override public void onCheckedChanged(boolean checked) { EventBus.getDefault().post(Settings.PREFERENCE_SUPPORT_LARGE_IMAGE); } }, menuClickListener)); menuList.add(new CheckMenu(this, "页面对用户可见时才解码超大图", Settings.PREFERENCE_PAGE_VISIBLE_TO_USER_DECODE_LARGE_IMAGE, null, menuClickListener)); menuList.add("GIF"); menuList.add(new CheckMenu(this, "搜索列表中播放GIF图", Settings.PREFERENCE_PLAY_GIF_ON_LIST, new CheckMenu.OnCheckedChangedListener() { @Override public void onCheckedChanged(boolean checked) { EventBus.getDefault().post(Settings.PREFERENCE_PLAY_GIF_ON_LIST); } }, menuClickListener)); menuList.add(new CheckMenu(this, "显示GIF图标识", Settings.PREFERENCE_SHOW_GIF_FLAG, new CheckMenu.OnCheckedChangedListener() { @Override public void onCheckedChanged(boolean checked) { EventBus.getDefault().post(Settings.PREFERENCE_SHOW_GIF_FLAG); } }, menuClickListener)); menuList.add("解码"); menuList.add(new CheckMenu(this, "全局解码时质量优先", Settings.PREFERENCE_GLOBAL_IN_PREFER_QUALITY_OVER_SPEED, new CheckMenu.OnCheckedChangedListener() { @Override public void onCheckedChanged(boolean checked) { EventBus.getDefault().post(Settings.PREFERENCE_GLOBAL_IN_PREFER_QUALITY_OVER_SPEED); } }, menuClickListener)); menuList.add(new CheckMenu(this, "全局使用低质量图片", Settings.PREFERENCE_GLOBAL_LOW_QUALITY_IMAGE, new CheckMenu.OnCheckedChangedListener() { @Override public void onCheckedChanged(boolean checked) { EventBus.getDefault().post(Settings.PREFERENCE_GLOBAL_LOW_QUALITY_IMAGE); } }, menuClickListener)); menuList.add(new CheckMenu(this, "开启缩略图模式", Settings.PREFERENCE_THUMBNAIL_MODE, new CheckMenu.OnCheckedChangedListener() { @Override public void onCheckedChanged(boolean checked) { EventBus.getDefault().post(Settings.PREFERENCE_THUMBNAIL_MODE); } }, menuClickListener)); menuList.add(new CheckMenu(this, "缓存处理过的图片", Settings.PREFERENCE_CACHE_PROCESSED_IMAGE, new CheckMenu.OnCheckedChangedListener() { @Override public void onCheckedChanged(boolean checked) { EventBus.getDefault().post(Settings.PREFERENCE_CACHE_PROCESSED_IMAGE); } }, menuClickListener)); menuList.add(new CheckMenu(this, "纠正被旋转的图片", Settings.PREFERENCE_CORRECT_IMAGE_ORIENTATION, new CheckMenu.OnCheckedChangedListener() { @Override public void onCheckedChanged(boolean checked) { EventBus.getDefault().post(Settings.PREFERENCE_CORRECT_IMAGE_ORIENTATION); } }, menuClickListener)); menuList.add("其它"); menuList.add(new CheckMenu(this, "图片详情页面显示缩略图", Settings.PREFERENCE_SHOW_TOOLS_IN_IMAGE_DETAIL, new CheckMenu.OnCheckedChangedListener() { @Override public void onCheckedChanged(boolean checked) { EventBus.getDefault().post(Settings.PREFERENCE_SHOW_TOOLS_IN_IMAGE_DETAIL); } }, menuClickListener)); menuList.add(new CheckMenu(this, "显示按下状态", Settings.PREFERENCE_CLICK_SHOW_PRESSED_STATUS, new CheckMenu.OnCheckedChangedListener() { @Override public void onCheckedChanged(boolean checked) { EventBus.getDefault().post(Settings.PREFERENCE_CLICK_SHOW_PRESSED_STATUS); } }, menuClickListener)); menuList.add(new CheckMenu(this, "显示图片来源角标", Settings.PREFERENCE_SHOW_IMAGE_FROM_FLAG, new CheckMenu.OnCheckedChangedListener() { @Override public void onCheckedChanged(boolean checked) { EventBus.getDefault().post(Settings.PREFERENCE_SHOW_IMAGE_FROM_FLAG); } }, menuClickListener)); menuList.add(new CheckMenu(this, "显示图片下载进度", Settings.PREFERENCE_SHOW_IMAGE_DOWNLOAD_PROGRESS, new CheckMenu.OnCheckedChangedListener() { @Override public void onCheckedChanged(boolean checked) { EventBus.getDefault().post(Settings.PREFERENCE_SHOW_IMAGE_DOWNLOAD_PROGRESS); } }, menuClickListener)); menuList.add(new CheckMenu(this, "暂停下载时点击显示图片", Settings.PREFERENCE_CLICK_DISPLAY_ON_PAUSE_DOWNLOAD, new CheckMenu.OnCheckedChangedListener() { @Override public void onCheckedChanged(boolean checked) { EventBus.getDefault().post(Settings.PREFERENCE_CLICK_DISPLAY_ON_PAUSE_DOWNLOAD); } }, menuClickListener)); menuList.add(new CheckMenu(this, "显示失败时点击重试", Settings.PREFERENCE_CLICK_DISPLAY_ON_FAILED, new CheckMenu.OnCheckedChangedListener() { @Override public void onCheckedChanged(boolean checked) { EventBus.getDefault().post(Settings.PREFERENCE_CLICK_DISPLAY_ON_FAILED); } }, menuClickListener)); menuList.add(new CheckMenu(this, "列表滑动时不加载新图片", Settings.PREFERENCE_SCROLLING_PAUSE_LOAD, new CheckMenu.OnCheckedChangedListener() { @Override public void onCheckedChanged(boolean checked) { EventBus.getDefault().post(Settings.PREFERENCE_SCROLLING_PAUSE_LOAD); } }, menuClickListener)); menuList.add(new CheckMenu(this, "移动网络时不下载新图片", Settings.PREFERENCE_MOBILE_NETWORK_PAUSE_DOWNLOAD, new CheckMenu.OnCheckedChangedListener() { @Override public void onCheckedChanged(boolean checked) { EventBus.getDefault().post(Settings.PREFERENCE_MOBILE_NETWORK_PAUSE_DOWNLOAD); } }, menuClickListener)); menuList.add("日志"); menuList.add(new CheckMenu(this, "请求日志", Settings.PREFERENCE_LOG_REQUEST, null, menuClickListener)); menuList.add(new CheckMenu(this, "缓存日志", Settings.PREFERENCE_LOG_CACHE, null, menuClickListener)); menuList.add(new CheckMenu(this, "手势缩放日志", Settings.PREFERENCE_LOG_ZOOM, null, menuClickListener)); menuList.add(new CheckMenu(this, "分块显示超大图日志", Settings.PREFERENCE_LOG_LARGE, null, menuClickListener)); menuList.add(new CheckMenu(this, "时间日志", Settings.PREFERENCE_LOG_TIME, null, menuClickListener)); menuList.add(new CheckMenu(this, "其它日志", Settings.PREFERENCE_LOG_BASE, null, menuClickListener)); menuList.add(new CheckMenu(this, "同步输出日志到cache/sketch_log目录下", Settings.PREFERENCE_OUT_LOG_2_SDCARD, null, menuClickListener)); AssemblyRecyclerAdapter adapter = new AssemblyRecyclerAdapter(menuList); adapter.addItemFactory(new MenuTitleItemFactory()); adapter.addItemFactory(new PageMenuItemFactory(new PageMenuItemFactory.OnClickItemListener() { @Override public void onClickItem(Page page) { switchPage(page); } })); adapter.addItemFactory(new CheckMenuItemFactory()); adapter.addItemFactory(new InfoMenuItemFactory()); menuRecyclerView.setLayoutManager(new LinearLayoutManager(getBaseContext())); menuRecyclerView.setAdapter(adapter); } @Override protected boolean isDisableSetFitsSystemWindows() { return true; } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); // 同步状态,这一步很重要,要不然初始 toggleDrawable.syncState(); toggleDrawable.onDrawerSlide(null, 1.0f); toggleDrawable.onDrawerSlide(null, 0.5f); toggleDrawable.onDrawerSlide(null, 0.0f); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); toggleDrawable.onConfigurationChanged(newConfig); } private void switchPage(Page newPage) { if (this.page == newPage) { return; } this.page = newPage; if (page == Page.STAR) { AnimationUtils.visibleViewByAlpha(starTabStrip); } else { AnimationUtils.invisibleViewByAlpha(starTabStrip); } if (page == Page.APP_LIST) { AnimationUtils.visibleViewByAlpha(appListTabStrip); } else { AnimationUtils.invisibleViewByAlpha(appListTabStrip); } getSupportActionBar().setTitle(page.getName()); getSupportFragmentManager().beginTransaction() .setCustomAnimations(R.anim.window_push_enter, R.anim.window_push_exit) .replace(R.id.frame_main_content, page.getFragment()) .commit(); drawerLayout.post(new Runnable() { @Override public void run() { drawerLayout.closeDrawer(Gravity.LEFT); } }); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MENU) { if (drawerLayout.isDrawerOpen(Gravity.LEFT)) { drawerLayout.closeDrawer(Gravity.LEFT); } else { drawerLayout.openDrawer(Gravity.LEFT); } return true; } else { return super.onKeyDown(keyCode, event); } } @Override public PagerSlidingTabStrip onGetStarTabStrip() { return starTabStrip; } @Override public PagerSlidingTabStrip onGetAppListTabStrip() { return appListTabStrip; } @Override public void onBackPressed() { long currentTime = System.currentTimeMillis(); if ((currentTime - lastClickBackTime) > 2000) { lastClickBackTime = currentTime; Toast.makeText(getBaseContext(), "再按一下返回键退出" + getResources().getString(R.string.app_name), Toast.LENGTH_SHORT).show(); return; } super.onBackPressed(); } @Override public void onToggleToGifSample() { switchPage(Page.SEARCH); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { boolean result = true; try { result = super.dispatchTouchEvent(ev); } catch (RuntimeException e) { e.printStackTrace(); } return result; } @Override public void onApplyBackground(String imageUri) { backgroundImageView.displayImage(imageUri); menuBackgroundImageView.displayImage(imageUri); } public enum Page { STAR("明星图片", StarIndexFragment.class, false, false), SEARCH("图片搜索", SearchFragment.class, false, false), PHOTO_ALBUM("本地相册", PhotoAlbumFragment.class, false, false), APP_LIST("本地APP", AppListFragment.class, false, false), ABOUT("关于", AboutFragment.class, false, false), LARGE_IMAGE("超大图片测试", LargeImageTestFragment.class, true, false), IMAGE_PROCESSOR_TEST("ImageProcessor测试", ImageProcessorTestFragment.class, true, false), IMAGE_SHAPER_TESt("ImageShaper测试", ImageShaperTestFragment.class, true, false), REPEAT_LOAD_OR_DOWNLOAD_TEST("重复加载/下载测试", RepeatLoadOrDownloadTestFragment.class, true, false), IN_BITMAP_TESt("inBitmap测试", InBitmapTestFragment.class, true, false), OTHER_TEST("其它测试", OtherTestFragment.class, true, !BuildConfig.DEBUG),; private String name; private Class<? extends Fragment> fragmentClass; private boolean disable; private boolean test; Page(String name, Class<? extends Fragment> fragmentClass, boolean test, boolean disable) { this.name = name; this.fragmentClass = fragmentClass; this.disable = disable; this.test = test; } public static Page[] getNormalPage() { List<Page> normalPageList = new LinkedList<Page>(); for (Page page : values()) { if (!page.test) { normalPageList.add(page); } } return normalPageList.toArray(new Page[normalPageList.size()]); } public static Page[] getTestPage() { List<Page> testPageList = new LinkedList<Page>(); for (Page page : values()) { if (page.test) { testPageList.add(page); } } return testPageList.toArray(new Page[testPageList.size()]); } public String getName() { return name; } public Fragment getFragment() { try { return fragmentClass.newInstance(); } catch (InstantiationException e) { e.printStackTrace(); return null; } catch (IllegalAccessException e) { e.printStackTrace(); return null; } } public boolean isDisable() { return disable; } } public static class TitleTabFactory implements PagerSlidingTabStrip.TabViewFactory { private String[] titles; private Context context; public TitleTabFactory(String[] titles, Context context) { this.titles = titles; this.context = context; } @Override public void addTabs(ViewGroup viewGroup, int i) { int number = 0; for (String title : titles) { TextView textView = new TextView(context); textView.setText(title); int padding = SketchUtils.dp2px(context, 12); if (number == 0) { textView.setPadding( padding, padding, padding / 2, padding); } else if (number == titles.length - 1) { textView.setPadding( padding / 2, padding, padding, padding); } else { textView.setPadding( padding / 2, padding, padding / 2, padding); } textView.setGravity(Gravity.CENTER); textView.setTextColor(context.getResources().getColorStateList(R.color.tab)); textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 12); viewGroup.addView(textView); number++; } } } }