1
0
mirror of https://github.com/TwidereProject/Twidere-Android synced 2025-02-07 15:28:51 +01:00

fixed tab measurement

This commit is contained in:
Mariotaku Lee 2016-03-23 14:38:24 +08:00
parent 2caf013b20
commit 33eecaf954
4 changed files with 140 additions and 46 deletions

View File

@ -26,14 +26,19 @@ import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.database.ContentObserver;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceActivity;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
@ -43,6 +48,7 @@ import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.support.v4.widget.DrawerLayout;
import android.support.v4.widget.DrawerLayoutAccessor;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatDelegate;
import android.support.v7.widget.Toolbar;
import android.util.SparseIntArray;
@ -55,6 +61,7 @@ import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.MarginLayoutParams;
import android.view.Window;
import android.widget.ImageButton;
import com.squareup.otto.Subscribe;
@ -105,24 +112,24 @@ public class HomeActivity extends BaseActivity implements OnClickListener, OnPag
private final ContentObserver mAccountChangeObserver = new AccountChangeObserver(this, mHandler);
private ParcelableAccount mSelectedAccountToSearch;
private int mTabColumns;
private MultiSelectEventHandler mMultiSelectHandler;
private SupportTabsAdapter mPagerAdapter;
private ExtendedViewPager mViewPager;
private Toolbar mActionBar;
private Toolbar mToolbar;
private View mWindowOverlay;
private TabPagerIndicator mTabIndicator;
private DrawerLayout mDrawerLayout;
private View mEmptyTabHint;
private FloatingActionButton mActionsButton;
private ExtendedRelativeLayout mHomeContent;
private ImageButton mDrawerToggleButton;
private UpdateUnreadCountTask mUpdateUnreadCountTask;
private OnSharedPreferenceChangeListener mReadStateChangeListener = new OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
@ -130,7 +137,38 @@ public class HomeActivity extends BaseActivity implements OnClickListener, OnPag
}
};
private ControlBarShowHideHelper mControlBarShowHideHelper = new ControlBarShowHideHelper(this);
private int mTabColumns;
private ActionBarDrawerToggle mDrawerToggle;
private ActionBarDrawerToggle.Delegate mHomeDrawerToggleDelegate = new ActionBarDrawerToggle.Delegate() {
@Override
public void setActionBarUpIndicator(Drawable upDrawable, @StringRes int contentDescRes) {
mDrawerToggleButton.setImageDrawable(upDrawable);
mDrawerToggleButton.setContentDescription(getString(contentDescRes));
}
@Override
public void setActionBarDescription(@StringRes int contentDescRes) {
mDrawerToggleButton.setContentDescription(getString(contentDescRes));
}
@Override
public Drawable getThemeUpIndicator() {
final int[] attrs = {android.support.v7.appcompat.R.attr.homeAsUpIndicator};
final TypedArray a = obtainStyledAttributes(attrs);
final Drawable result = a.getDrawable(0);
a.recycle();
return result;
}
@Override
public Context getActionBarThemedContext() {
return mToolbar.getContext();
}
@Override
public boolean isNavigationVisible() {
return true;
}
};
public void closeAccountsDrawer() {
if (mDrawerLayout == null) return;
@ -189,6 +227,9 @@ public class HomeActivity extends BaseActivity implements OnClickListener, OnPag
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
switch (item.getItemId()) {
case android.R.id.home: {
final FragmentManager fm = getSupportFragmentManager();
@ -334,7 +375,7 @@ public class HomeActivity extends BaseActivity implements OnClickListener, OnPag
supportRequestWindowFeature(AppCompatDelegate.FEATURE_ACTION_MODE_OVERLAY);
setContentView(R.layout.activity_home);
setSupportActionBar(mActionBar);
setSupportActionBar(mToolbar);
ThemeUtils.setCompatContentViewOverlay(getWindow(), new EmptyDrawable());
@ -343,6 +384,8 @@ public class HomeActivity extends BaseActivity implements OnClickListener, OnPag
mTabColumns = getResources().getInteger(R.integer.default_tab_columns);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.open_accounts_dashboard,
R.string.close_accounts_dashboard);
mHomeContent.setOnFitSystemWindowsListener(this);
mPagerAdapter = new SupportTabsAdapter(this, getSupportFragmentManager(), mTabIndicator, mTabColumns);
mViewPager.setAdapter(mPagerAdapter);
@ -371,6 +414,7 @@ public class HomeActivity extends BaseActivity implements OnClickListener, OnPag
mActionsButton.setOnClickListener(this);
mActionsButton.setOnLongClickListener(this);
mDrawerToggleButton.setOnClickListener(this);
mEmptyTabHint.setOnClickListener(this);
setupSlidingMenu();
@ -466,6 +510,14 @@ public class HomeActivity extends BaseActivity implements OnClickListener, OnPag
startActivityForResult(intent, REQUEST_SETTINGS);
break;
}
case R.id.drawer_toggle: {
if (mDrawerLayout.isDrawerOpen(GravityCompat.START) || mDrawerLayout.isDrawerOpen(GravityCompat.END)) {
mDrawerLayout.closeDrawers();
} else {
mDrawerLayout.openDrawer(GravityCompat.START);
}
break;
}
}
}
@ -557,6 +609,20 @@ public class HomeActivity extends BaseActivity implements OnClickListener, OnPag
super.onDestroy();
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Pass any configuration change to the drawer toggle
mDrawerToggle.onConfigurationChanged(newConfig);
}
@Override
public float getControlBarOffset() {
if (mTabColumns > 1) {
@ -570,7 +636,7 @@ public class HomeActivity extends BaseActivity implements OnClickListener, OnPag
return 1 - mActionsButton.getTranslationY() / total;
}
final float totalHeight = getControlBarHeight();
return 1 + mActionBar.getTranslationY() / totalHeight;
return 1 + mToolbar.getTranslationY() / totalHeight;
}
@Override
@ -578,7 +644,7 @@ public class HomeActivity extends BaseActivity implements OnClickListener, OnPag
final ActionBar actionBar = getSupportActionBar();
if (actionBar == null) return;
final int translationY = mTabColumns > 1 ? 0 : (int) (getControlBarHeight() * (offset - 1));
mActionBar.setTranslationY(translationY);
mToolbar.setTranslationY(translationY);
mWindowOverlay.setTranslationY(translationY);
final ViewGroup.LayoutParams lp = mActionsButton.getLayoutParams();
if (lp instanceof MarginLayoutParams) {
@ -593,13 +659,48 @@ public class HomeActivity extends BaseActivity implements OnClickListener, OnPag
public void onContentChanged() {
super.onContentChanged();
mTabIndicator = (TabPagerIndicator) findViewById(R.id.main_tabs);
mActionBar = (Toolbar) findViewById(R.id.action_bar);
mToolbar = (Toolbar) findViewById(R.id.action_bar);
mDrawerLayout = (DrawerLayout) findViewById(R.id.home_menu);
mViewPager = (ExtendedViewPager) findViewById(R.id.main_pager);
mEmptyTabHint = findViewById(R.id.empty_tab_hint);
mActionsButton = (FloatingActionButton) findViewById(R.id.actions_button);
mHomeContent = (ExtendedRelativeLayout) findViewById(R.id.home_content);
mWindowOverlay = findViewById(R.id.window_overlay);
mDrawerToggleButton = (ImageButton) findViewById(R.id.drawer_toggle);
}
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
}
@Override
public void onDrawerOpened(View drawerView) {
}
@Override
public void onDrawerClosed(View drawerView) {
}
@Override
public void onDrawerStateChanged(int newState) {
final Fragment fragment = getLeftDrawerFragment();
if (fragment instanceof AccountsDashboardFragment) {
((AccountsDashboardFragment) fragment).loadAccounts();
}
}
@Nullable
@Override
public ActionBarDrawerToggle.Delegate getDrawerToggleDelegate() {
return mHomeDrawerToggleDelegate;
}
@Override
public int getControlBarHeight() {
return mTabIndicator.getHeight() - mTabIndicator.getStripHeight();
}
private Fragment getKeyboardShortcutRecipient() {
@ -612,11 +713,6 @@ public class HomeActivity extends BaseActivity implements OnClickListener, OnPag
}
}
@Override
public int getControlBarHeight() {
return mTabIndicator.getHeight() - mTabIndicator.getStripHeight();
}
private boolean handleFragmentKeyboardShortcutRepeat(final KeyboardShortcutsHandler handler,
final int keyCode, final int repeatCount,
@NonNull final KeyEvent event, int metaState) {
@ -757,6 +853,7 @@ public class HomeActivity extends BaseActivity implements OnClickListener, OnPag
private void setupSlidingMenu() {
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow_start, GravityCompat.START);
mDrawerLayout.addDrawerListener(mDrawerToggle);
mDrawerLayout.addDrawerListener(this);
final Window window = getWindow();
ThemeUtils.applyWindowBackground(this, mHomeContent,
@ -815,29 +912,6 @@ public class HomeActivity extends BaseActivity implements OnClickListener, OnPag
mActionsButton.setContentDescription(getString(title));
}
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
}
@Override
public void onDrawerOpened(View drawerView) {
}
@Override
public void onDrawerClosed(View drawerView) {
}
@Override
public void onDrawerStateChanged(int newState) {
final Fragment fragment = getLeftDrawerFragment();
if (fragment instanceof AccountsDashboardFragment) {
((AccountsDashboardFragment) fragment).loadAccounts();
}
}
private static final class AccountChangeObserver extends ContentObserver {
private final HomeActivity mActivity;

View File

@ -64,7 +64,7 @@ public class TabPagerIndicator extends RecyclerView implements PagerIndicator, C
ViewCompat.setOverScrollMode(this, ViewCompat.OVER_SCROLL_NEVER);
setHorizontalScrollBarEnabled(false);
setVerticalScrollBarEnabled(false);
setLayoutManager(mLayoutManager = new TabLayoutManager(context));
setLayoutManager(mLayoutManager = new TabLayoutManager(context, this));
setItemContext(context);
setAdapter(mIndicatorAdapter);
final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TabPagerIndicator);
@ -489,9 +489,11 @@ public class TabPagerIndicator extends RecyclerView implements PagerIndicator, C
private static class TabLayoutManager extends FixedLinearLayoutManager {
private boolean mTabExpandEnabled;
private final RecyclerView mRecyclerView;
public TabLayoutManager(Context context) {
public TabLayoutManager(Context context, RecyclerView recyclerView) {
super(context, HORIZONTAL, false);
mRecyclerView = recyclerView;
setAutoMeasureEnabled(true);
}
@ -502,7 +504,7 @@ public class TabPagerIndicator extends RecyclerView implements PagerIndicator, C
if (!isTabExpandEnabled()) return;
final int count = getItemCount();
if (count == 0) return;
final int parentHeight = getHeight(), parentWidth = getWidth();
final int parentHeight = mRecyclerView.getHeight(), parentWidth = mRecyclerView.getWidth();
final int decoratedWidth = getDecoratedMeasuredWidth(child);
final int measuredWidth = child.getMeasuredWidth();
final int decoratorWidth = decoratedWidth - measuredWidth;

View File

@ -42,14 +42,31 @@
app:contentInsetEnd="0dp"
app:contentInsetStart="0dp">
<org.mariotaku.twidere.view.TabPagerIndicator
android:id="@+id/main_tabs"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:tabDisplayOption="icon"
app:tabExpandEnabled="true"
app:tabHorizontalPadding="@dimen/element_spacing_normal"
tools:listitem="@layout/layout_tab_item"/>
android:orientation="horizontal">
<ImageButton
android:id="@+id/drawer_toggle"
style="?borderlessButtonStyle"
android:layout_width="?actionBarSize"
android:layout_height="?actionBarSize"
android:layout_weight="0"
android:tag="tint|primary_color_dependent"
android:background="?actionBarItemBackground"
android:contentDescription="@string/open_accounts_dashboard"/>
<org.mariotaku.twidere.view.TabPagerIndicator
android:id="@+id/main_tabs"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
app:tabDisplayOption="icon"
app:tabExpandEnabled="true"
app:tabHorizontalPadding="@dimen/element_spacing_normal"
tools:listitem="@layout/layout_tab_item"/>
</LinearLayout>
</android.support.v7.widget.Toolbar>
<View

View File

@ -665,6 +665,7 @@
<string name="reset_to_default">Reset to default</string>
<string name="reset_keyboard_shortcuts_confirm">Reset keyboard shortcuts to default?</string>
<string name="open_accounts_dashboard">Open accounts dashboard</string>
<string name="close_accounts_dashboard">Close accounts dashboard</string>
<string name="previous_tab">Previous tab</string>
<string name="next_tab">Next tab</string>
<string name="keyboard_shortcut_back">Back</string>