Improve settings navigation layout
This commit is contained in:
@@ -5,7 +5,9 @@ import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.activity.OnBackPressedCallback;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.ActionBarDrawerToggle;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
@@ -22,10 +24,16 @@ import se.ajpanton.statusbartweak.R;
|
||||
|
||||
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
|
||||
private static final String EXTRA_OPEN_NAV_ITEM = "open_nav_item";
|
||||
private static final float PERMANENT_SIDEBAR_FOLDED_WIDTH_MULTIPLIER = 1.1f;
|
||||
|
||||
private SafeInsetDrawerLayout drawerLayout;
|
||||
private NavigationView navigationView;
|
||||
private Integer navigationBasePaddingLeft;
|
||||
private NavigationView drawerNavigationView;
|
||||
private NavigationView permanentNavigationView;
|
||||
private MaterialToolbar toolbar;
|
||||
private ActionBarDrawerToggle drawerToggle;
|
||||
private Integer drawerNavigationBasePaddingLeft;
|
||||
private Integer permanentNavigationBasePaddingLeft;
|
||||
private boolean permanentSidebar;
|
||||
|
||||
public static Intent newOpenDebugIntent(Context context) {
|
||||
Intent intent = new Intent(context, MainActivity.class);
|
||||
@@ -39,24 +47,42 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_main);
|
||||
|
||||
MaterialToolbar toolbar = findViewById(R.id.toolbar);
|
||||
toolbar = findViewById(R.id.toolbar);
|
||||
setSupportActionBar(toolbar);
|
||||
|
||||
drawerLayout = findViewById(R.id.drawer_layout);
|
||||
navigationView = findViewById(R.id.nav_view);
|
||||
navigationView.setNavigationItemSelectedListener(this);
|
||||
navigationView.getMenu().setGroupCheckable(0, true, true);
|
||||
drawerNavigationView = findViewById(R.id.nav_view_drawer);
|
||||
permanentNavigationView = findViewById(R.id.nav_view_permanent);
|
||||
setupNavigationView(drawerNavigationView);
|
||||
setupNavigationView(permanentNavigationView);
|
||||
applyNavigationDrawerInsets();
|
||||
|
||||
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
|
||||
drawerToggle = new ActionBarDrawerToggle(
|
||||
this,
|
||||
drawerLayout,
|
||||
toolbar,
|
||||
R.string.nav_open,
|
||||
R.string.nav_close
|
||||
);
|
||||
drawerLayout.addDrawerListener(toggle);
|
||||
toggle.syncState();
|
||||
drawerLayout.addDrawerListener(drawerToggle);
|
||||
drawerToggle.syncState();
|
||||
toolbar.setNavigationOnClickListener(v -> {
|
||||
if (!permanentSidebar) {
|
||||
drawerLayout.openDrawer(GravityCompat.START);
|
||||
}
|
||||
});
|
||||
getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
|
||||
@Override
|
||||
public void handleOnBackPressed() {
|
||||
if (!permanentSidebar && drawerLayout.isDrawerOpen(GravityCompat.START)) {
|
||||
drawerLayout.closeDrawer(GravityCompat.START);
|
||||
return;
|
||||
}
|
||||
setEnabled(false);
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
setEnabled(true);
|
||||
}
|
||||
});
|
||||
|
||||
if (savedInstanceState == null) {
|
||||
int initialItemId = resolveInitialItemId(getIntent());
|
||||
@@ -77,7 +103,9 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
|
||||
@Override
|
||||
public boolean onNavigationItemSelected(@NonNull android.view.MenuItem item) {
|
||||
navigateTo(item.getItemId());
|
||||
drawerLayout.closeDrawer(GravityCompat.START);
|
||||
if (!permanentSidebar) {
|
||||
drawerLayout.closeDrawer(GravityCompat.START);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -149,6 +177,11 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
|
||||
}
|
||||
|
||||
private void syncDrawerSelection(int itemId) {
|
||||
syncNavigationSelection(drawerNavigationView, itemId);
|
||||
syncNavigationSelection(permanentNavigationView, itemId);
|
||||
}
|
||||
|
||||
private void syncNavigationSelection(NavigationView navigationView, int itemId) {
|
||||
if (navigationView == null) {
|
||||
return;
|
||||
}
|
||||
@@ -167,6 +200,17 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
|
||||
navigationView.invalidate();
|
||||
}
|
||||
|
||||
private void setupNavigationView(NavigationView navigationView) {
|
||||
if (navigationView == null) {
|
||||
return;
|
||||
}
|
||||
navigationView.setNavigationItemSelectedListener(this);
|
||||
navigationView.getMenu().setGroupCheckable(0, true, true);
|
||||
navigationView.addOnLayoutChangeListener((view, left, top, right, bottom,
|
||||
oldLeft, oldTop, oldRight, oldBottom) ->
|
||||
updateNavigationHeaderHeight(navigationView));
|
||||
}
|
||||
|
||||
private int resolveInitialItemId(Intent intent) {
|
||||
int requested = resolveOpenItemId(intent);
|
||||
return requested != -1 ? requested : R.id.nav_layout;
|
||||
@@ -195,6 +239,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
|
||||
private void applyNavigationDrawerMarginsFromRootInsets() {
|
||||
WindowInsetsCompat insets = ViewCompat.getRootWindowInsets(drawerLayout);
|
||||
if (insets == null) {
|
||||
applyNavigationDrawerSafeArea(0, 0);
|
||||
return;
|
||||
}
|
||||
Insets safeInsets = insets.getInsetsIgnoringVisibility(
|
||||
@@ -206,10 +251,25 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
|
||||
int safeLeft = Math.max(Math.max(0, leftInset), Math.max(0, drawerLayout.getPaddingLeft()));
|
||||
int safeRight = Math.max(Math.max(0, rightInset), Math.max(0, drawerLayout.getPaddingRight()));
|
||||
drawerLayout.setDrawerSafeInsets(safeLeft, safeRight);
|
||||
if (navigationBasePaddingLeft == null) {
|
||||
navigationBasePaddingLeft = navigationView.getPaddingLeft();
|
||||
drawerNavigationBasePaddingLeft = applyNavigationLeftPadding(
|
||||
drawerNavigationView,
|
||||
drawerNavigationBasePaddingLeft,
|
||||
safeLeft);
|
||||
permanentNavigationBasePaddingLeft = applyNavigationLeftPadding(
|
||||
permanentNavigationView,
|
||||
permanentNavigationBasePaddingLeft,
|
||||
0);
|
||||
updatePermanentSidebarMode();
|
||||
}
|
||||
|
||||
private Integer applyNavigationLeftPadding(NavigationView navigationView,
|
||||
Integer basePaddingLeft,
|
||||
int safeLeft) {
|
||||
if (navigationView == null) {
|
||||
return basePaddingLeft;
|
||||
}
|
||||
int leftPadding = navigationBasePaddingLeft + safeLeft;
|
||||
int base = basePaddingLeft != null ? basePaddingLeft : navigationView.getPaddingLeft();
|
||||
int leftPadding = base + safeLeft;
|
||||
if (navigationView.getPaddingLeft() != leftPadding
|
||||
|| Math.round(navigationView.getTranslationX()) != 0) {
|
||||
navigationView.setTranslationX(0f);
|
||||
@@ -220,5 +280,72 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
|
||||
navigationView.getPaddingBottom());
|
||||
navigationView.requestLayout();
|
||||
}
|
||||
return base;
|
||||
}
|
||||
|
||||
private void updatePermanentSidebarMode() {
|
||||
int rootWidth = drawerLayout.getWidth();
|
||||
if (rootWidth <= 0) {
|
||||
return;
|
||||
}
|
||||
int drawerWidth = getResources().getDimensionPixelSize(R.dimen.sbt_navigation_drawer_width);
|
||||
int foldedPortraitWidth = getResources().getDimensionPixelSize(R.dimen.sbt_folded_portrait_width);
|
||||
boolean shouldUsePermanentSidebar = rootWidth >= drawerWidth
|
||||
+ Math.round(foldedPortraitWidth * PERMANENT_SIDEBAR_FOLDED_WIDTH_MULTIPLIER);
|
||||
if (permanentSidebar != shouldUsePermanentSidebar) {
|
||||
permanentSidebar = shouldUsePermanentSidebar;
|
||||
drawerToggle.setDrawerIndicatorEnabled(!permanentSidebar);
|
||||
toolbar.setVisibility(permanentSidebar ? View.GONE : View.VISIBLE);
|
||||
if (permanentSidebar) {
|
||||
permanentNavigationView.setVisibility(View.VISIBLE);
|
||||
drawerLayout.closeDrawer(GravityCompat.START, false);
|
||||
} else {
|
||||
drawerNavigationView.setVisibility(View.VISIBLE);
|
||||
drawerLayout.closeDrawer(GravityCompat.START, false);
|
||||
permanentNavigationView.setVisibility(View.GONE);
|
||||
drawerNavigationView.requestLayout();
|
||||
}
|
||||
drawerToggle.syncState();
|
||||
}
|
||||
updateNavigationHeaderHeight(drawerNavigationView);
|
||||
updateNavigationHeaderHeight(permanentNavigationView);
|
||||
}
|
||||
|
||||
private void updateNavigationHeaderHeight(NavigationView navigationView) {
|
||||
if (navigationView == null || navigationView.getHeaderCount() == 0) {
|
||||
return;
|
||||
}
|
||||
int navigationHeight = navigationView.getHeight();
|
||||
if (navigationHeight <= 0) {
|
||||
return;
|
||||
}
|
||||
int menuRows = countVisibleMenuRows(navigationView.getMenu());
|
||||
int menuHeight = menuRows * getResources().getDimensionPixelSize(R.dimen.sbt_navigation_menu_item_height);
|
||||
int minHeaderHeight = getResources().getDimensionPixelSize(R.dimen.sbt_drawer_header_min_height);
|
||||
int maxHeaderHeight = getResources().getDimensionPixelSize(R.dimen.sbt_drawer_header_max_height);
|
||||
int desiredHeaderHeight = Math.max(
|
||||
minHeaderHeight,
|
||||
Math.min(maxHeaderHeight, navigationHeight - menuHeight));
|
||||
View header = navigationView.getHeaderView(0);
|
||||
if (header == null || header.getLayoutParams() == null
|
||||
|| header.getLayoutParams().height == desiredHeaderHeight) {
|
||||
return;
|
||||
}
|
||||
header.getLayoutParams().height = desiredHeaderHeight;
|
||||
header.requestLayout();
|
||||
}
|
||||
|
||||
private int countVisibleMenuRows(Menu menu) {
|
||||
if (menu == null) {
|
||||
return 0;
|
||||
}
|
||||
int count = 0;
|
||||
for (int i = 0; i < menu.size(); i++) {
|
||||
MenuItem item = menu.getItem(i);
|
||||
if (item != null && item.isVisible()) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,30 +9,52 @@
|
||||
android:fitsSystemWindows="true">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/main_shell"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical">
|
||||
android:orientation="horizontal">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/toolbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/sbt_toolbar_background"
|
||||
android:elevation="0dp"
|
||||
android:theme="@style/ThemeOverlay.MaterialComponents.Dark.ActionBar"
|
||||
app:navigationIconTint="@color/sbt_on_primary"
|
||||
app:titleTextColor="@android:color/white" />
|
||||
<com.google.android.material.navigation.NavigationView
|
||||
android:id="@+id/nav_view_permanent"
|
||||
android:layout_width="@dimen/sbt_navigation_drawer_width"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/sbt_surface"
|
||||
android:fitsSystemWindows="true"
|
||||
android:visibility="gone"
|
||||
app:headerLayout="@layout/drawer_header"
|
||||
app:itemBackground="@drawable/drawer_item_background"
|
||||
app:itemTextColor="@color/drawer_item_text_color"
|
||||
app:menu="@menu/drawer_menu" />
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/content_frame"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
<LinearLayout
|
||||
android:id="@+id/main_content"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1"
|
||||
android:orientation="vertical">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/toolbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/sbt_toolbar_background"
|
||||
android:elevation="0dp"
|
||||
android:theme="@style/ThemeOverlay.MaterialComponents.Dark.ActionBar"
|
||||
app:navigationIconTint="@color/sbt_on_primary"
|
||||
app:titleTextColor="@android:color/white" />
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/content_frame"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<com.google.android.material.navigation.NavigationView
|
||||
android:id="@+id/nav_view"
|
||||
android:layout_width="wrap_content"
|
||||
android:id="@+id/nav_view_drawer"
|
||||
android:layout_width="@dimen/sbt_navigation_drawer_width"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="start"
|
||||
android:background="@color/sbt_surface"
|
||||
|
||||
@@ -2,11 +2,11 @@
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="172dp"
|
||||
android:layout_height="@dimen/sbt_drawer_header_height"
|
||||
android:background="@drawable/sbt_drawer_header_background"
|
||||
android:gravity="bottom"
|
||||
android:orientation="vertical"
|
||||
android:padding="20dp">
|
||||
android:padding="@dimen/sbt_drawer_header_padding">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<dimen name="sbt_navigation_drawer_width">216dp</dimen>
|
||||
<dimen name="sbt_folded_portrait_width">360dp</dimen>
|
||||
<dimen name="sbt_navigation_menu_item_height">48dp</dimen>
|
||||
<dimen name="sbt_drawer_header_height">86dp</dimen>
|
||||
<dimen name="sbt_drawer_header_min_height">86dp</dimen>
|
||||
<dimen name="sbt_drawer_header_max_height">172dp</dimen>
|
||||
<dimen name="sbt_drawer_header_padding">16dp</dimen>
|
||||
</resources>
|
||||
Reference in New Issue
Block a user