如何实现Telegram X等待网络时的状态栏提示及内容隐藏?
Hey there! I've spent some time digging into Android status bar customization, especially for API 27 (which matches your Nexus 5X emulator setup), and here's how you can replicate that "Waiting for network" behavior from Telegram X:
Telegram X achieves this by replacing the system's default status bar with a custom semi-transparent version when in a network-waiting state. This lets them hide native icons (notifications, network indicators) and display their own prompt. Here's the step-by-step implementation:
Step 1: Hide System Status Bar & Enable Layout Extension
First, we need to hide the native status bar icons and let our app's layout extend into the status bar area. Add this code in your Activity's onCreate method (or a dedicated state-change handler):
// Configure window to extend into status bar area getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_FULLSCREEN); // Hides native status bar icons
Step 2: Calculate Dynamic Status Bar Height
Since status bar height varies across devices, we'll fetch it dynamically:
private int getStatusBarHeight() { int height = 0; int resourceId = getResources().getIdentifier( "status_bar_height", "dimen", "android"); if (resourceId > 0) { height = getResources().getDimensionPixelSize(resourceId); } return height; }
Step 3: Add Custom Semi-Transparent Status Bar
Create a custom layout for your status bar (add this to your Activity's XML layout):
<!-- Custom status bar - hidden by default --> <LinearLayout android:id="@+id/custom_network_status_bar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#80000000" <!-- Semi-transparent black --> android:gravity="center" android:visibility="gone" android:paddingVertical="4dp"> <TextView android:layout_width="wrap_content" android:layout_height="match_parent" android:text="等待网络" android:textColor="#FFFFFF" android:gravity="center"/> </LinearLayout>
Then set its height to match the system status bar in your Activity code:
LinearLayout customStatusBar = findViewById(R.id.custom_network_status_bar); ViewGroup.LayoutParams params = customStatusBar.getLayoutParams(); params.height = getStatusBarHeight(); customStatusBar.setLayoutParams(params);
Step 4: Toggle Visibility Based on Network State
Create a method to switch between the native status bar and your custom one when network status changes:
private void updateNetworkStatusUI(boolean isWaitingForNetwork) { View decorView = getWindow().getDecorView(); LinearLayout customStatusBar = findViewById(R.id.custom_network_status_bar); if (isWaitingForNetwork) { // Show custom status bar, hide native icons decorView.setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_FULLSCREEN); customStatusBar.setVisibility(View.VISIBLE); } else { // Restore native status bar, hide custom one decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE); customStatusBar.setVisibility(View.GONE); } }
Call this method whenever your app detects a network disconnect/reconnect (use ConnectivityManager for network state listening).
Step 5: Handle Configuration Changes (Optional)
If your app supports screen rotation, re-calculate the status bar height in onConfigurationChanged:
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); LinearLayout customStatusBar = findViewById(R.id.custom_network_status_bar); ViewGroup.LayoutParams params = customStatusBar.getLayoutParams(); params.height = getStatusBarHeight(); customStatusBar.setLayoutParams(params); }
SYSTEM_UI_FLAG_FULLSCREENworks reliably on API 27 to hide native status bar icons while keeping the layout extended.- Avoid using newer
WindowInsetsAPIs if you're strictly targeting API 27, as the above method is more straightforward for this version.
内容的提问来源于stack exchange,提问作者Arthur Melo

