2013-05-23 31 views
26

Có thể xóa vĩnh viễn Thanh Điều hướng trên một hoạt động không? Tôi muốn xóa thanh bằng các nút xuất hiện ở nút màn hình trên máy tính bảng chứ không phải Thanh tác vụ. Here.Vĩnh viễn ẩn Thanh Điều hướng trong một hoạt động

Tôi biết không nên làm điều đó, tôi đã không đưa ra quyết định này, nhưng tôi cần phải làm điều đó. Trên bố cục của tôi, có một nút khác để rời khỏi hoạt động. Phần còn lại của ứng dụng của tôi có thể có và có Thanh Điều hướng.

Tôi đã tìm thấy mã này và điều chỉnh nó một chút. Vấn đề là ngay cả khi tôi ẩn thanh điều hướng, có một không gian màu đen còn lại phía sau. Tôi đoán hệ thống tính toán kích thước màn hình có tính đến thanh điều hướng?

public static class Content extends ImageView implements View.OnSystemUiVisibilityChangeListener, View.OnClickListener, ActionBar.OnMenuVisibilityListener { 
    Activity mActivity; 
    TextView mTitleView; 
    Button mPlayButton; 
    SeekBar mSeekView; 
    boolean mAddedMenuListener; 
    boolean mMenusOpen; 
    boolean mPaused; 
    boolean mNavVisible; 
    int mLastSystemUiVis; 

    Runnable mNavHider = new Runnable() { 
     @Override public void run() { 
      setNavVisibility(false); 
     } 
    }; 

    public Content(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setOnSystemUiVisibilityChangeListener(this); 
     setOnClickListener(this); 
    } 

    public void init(Activity activity, TextView title, Button playButton, 
      SeekBar seek) { 
     // This called by the containing activity to supply the surrounding 
     // state of the video player that it will interact with. 
     mActivity = activity; 
     mTitleView = title; 
     mPlayButton = playButton; 
     mSeekView = seek; 
     mPlayButton.setOnClickListener(this); 
     setPlayPaused(true); 
    } 

    @Override protected void onAttachedToWindow() { 
     super.onAttachedToWindow(); 
     if (mActivity != null) { 
      mAddedMenuListener = true; 
      mActivity.getActionBar().addOnMenuVisibilityListener(this); 
     } 
    } 

    @Override protected void onDetachedFromWindow() { 
     super.onDetachedFromWindow(); 
     if (mAddedMenuListener) { 
      mActivity.getActionBar().removeOnMenuVisibilityListener(this); 
     } 
    } 

    @Override public void onSystemUiVisibilityChange(int visibility) { 
     // Detect when we go out of nav-hidden mode, to clear our state 
     // back to having the full UI chrome up. Only do this when 
     // the state is changing and nav is no longer hidden. 
     int diff = mLastSystemUiVis^visibility; 
     mLastSystemUiVis = visibility; 
     if ((diff&SYSTEM_UI_FLAG_HIDE_NAVIGATION) != 0 
       && (visibility&SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) { 
      setNavVisibility(true); 
     } 
    } 

    @Override protected void onWindowVisibilityChanged(int visibility) { 
     super.onWindowVisibilityChanged(visibility); 

     // When we become visible or invisible, play is paused. 
     setPlayPaused(true); 
    } 

    @Override public void onClick(View v) { 
     if (v == mPlayButton) { 
      // Clicking on the play/pause button toggles its state. 
      setPlayPaused(!mPaused); 
     } else { 
      // Clicking elsewhere makes the navigation visible. 
      setNavVisibility(true); 
     } 
    } 

    @Override public void onMenuVisibilityChanged(boolean isVisible) { 
     mMenusOpen = isVisible; 
     setNavVisibility(true); 
    } 

    void setPlayPaused(boolean paused) { 
     mPaused = paused; 
     mPlayButton.setText(paused ? R.string.play : R.string.pause); 
     setKeepScreenOn(!paused); 
     setNavVisibility(true); 
    } 

    void setNavVisibility(boolean visible) { 
     int newVis = SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 
       | SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
       | SYSTEM_UI_FLAG_LAYOUT_STABLE; 
     if (!visible) { 
      newVis |= SYSTEM_UI_FLAG_LOW_PROFILE | SYSTEM_UI_FLAG_FULLSCREEN 
        | SYSTEM_UI_FLAG_HIDE_NAVIGATION; 
     } 

     // If we are now visible, schedule a timer for us to go invisible. 
     if (visible) { 
      Handler h = getHandler(); 
      if (h != null) { 
       h.removeCallbacks(mNavHider); 
       if (!mMenusOpen && !mPaused) { 
        // If the menus are open or play is paused, we will not auto-hide. 
        h.postDelayed(mNavHider, 1500); 
       } 
      } 
     } 

     // Set the new desired visibility. 
     setSystemUiVisibility(newVis); 
     mTitleView.setVisibility(visible ? VISIBLE : INVISIBLE); 
     mPlayButton.setVisibility(visible ? VISIBLE : INVISIBLE); 
     mSeekView.setVisibility(visible ? VISIBLE : INVISIBLE); 
    } 

} 
+0

Bạn khỏe không? hát mã này? –

Trả lời

5

AFAIK, điều này là không thể nếu không có quyền truy cập root. Nó sẽ là một vấn đề an ninh để có thể có một ứng dụng mà không thể được thoát ra với các nút hệ thống.

Chỉnh sửa, xem tại đây: Hide System Bar in Tablets

4

Thay đổi chủ đề trong tệp kê khai của bạn.

Nếu bạn muốn ẩn thanh nav cho một hoạt động mà bạn có thể sử dụng này:

<activity 
     android:name="Activity Name" 
     android:theme="@android:style/Theme.Black.NoTitleBar" 
     android:label="@string/app_name" > 

Nếu bạn muốn ẩn thanh nav cho toàn bộ ứng dụng mà bạn có thể sử dụng này:

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@android:style/Theme.Black.NoTitleBar" > 
+2

Tôi muốn xóa thanh điều hướng chứ không phải thanh tác vụ. Tôi muốn ẩn các nút xuất hiện ở cuối màn hình cho máy tính bảng. –

+0

hi steve, có một số vấn đề về đọc hiểu với những câu trả lời này. mọi người đều muốn bạn xóa thanh tác vụ. LOL. bạn đã bao giờ tìm ra nó từ 4.0 trở lên chưa? cảm ơn – steveh

57

Có một giải pháp bắt đầu với KitKat (4.4.2), được gọi là Immersive Mode: https://developer.android.com/training/system-ui/immersive.html

Về cơ bản, bạn nên thêm mã này vào phương pháp onResume() của bạn:

View decorView = getWindow().getDecorView(); 
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
           | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
           | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 
           | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 
           | View.SYSTEM_UI_FLAG_FULLSCREEN 
           | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 
+1

phải được chấp nhận trả lời – Jaysbays

+7

Nó không phải là vĩnh viễn. do đó, nó không đủ điều kiện làm câu trả lời được chấp nhận. –

19

Bạn có thể

Hai cách:

1- gốc thiết bị của bạn, sau đó mở thiết bị trong adb window command, và sau đó chạy như sau:

adb shell > 
su > 
pm disable com.android.systemui > 

và để có được nó trở lại chỉ làm tương tự nhưng thay đổi disable để enable.

2- thêm dòng sau vào cuối build.prop tập tin thiết bị của bạn:

qemu.hw.mainkeys = 1 

sau đó để lấy lại chỉ cần loại bỏ nó.

và nếu bạn không biết làm thế nào để chỉnh sửa build.prop file:

  • tải EsExplorer trên thiết bị của bạn và tìm kiếm build.prop sau đó thay đổi nó cho phép đọc và viết, cuối cùng thêm hàng.
  • tải xuống ứng dụng trình soạn thảo chuyên biệt build.prop như build.propEditor.
  • hoặc tham khảo that link.
+0

Bạn có biết chính xác chức năng com.android.systemui có? – JohnyTex

+0

Bạn có biết nếu qemu.hw.mainkeys = 1 sẽ hoạt động với tất cả các thiết bị có nút phần mềm không? – JohnyTex

+0

@JohnyTex com.android.systemui được sử dụng để tắt một số tính năng giao diện người dùng được thêm bởi hệ thống như Navigationbars và hình nền. Và khi nói về qemu.hw.mainkeys = 1, bạn có ý nghĩa gì với "thiết bị có nút phần mềm"? –

2

Sau khi xem DevBytes video (Roman Nurik) và đọc dòng cuối cùng trong tài liệu, mà nói:

Lưu ý: Nếu bạn thích những hành vi tự động ẩn của IMMERSIVE_STICKY nhưng cần phải cũng hiển thị các điều khiển giao diện người dùng của riêng bạn, chỉ cần sử dụng IMMERSIVE kết hợp với Handler.postDelayed() hoặc một cái gì đó tương tự như nhập lại chế độ chìm sau một vài giây.

câu trả lời, radu122 đã, đã làm việc cho tôi. Chỉ cần thiết lập một trình xử lý và bạn sẽ được tốt để đi.

Đây là mã mà làm việc cho tôi:

@Override 
protected void onResume() { 
    super.onResume(); 
    executeDelayed(); 
} 


private void executeDelayed() { 
    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      // execute after 500ms 
      hideNavBar(); 
     } 
    }, 500); 
} 


private void hideNavBar() { 
    if (Build.VERSION.SDK_INT >= 19) { 
     View v = getWindow().getDecorView(); 
     v.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
           | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
           | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 
           | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 
           | View.SYSTEM_UI_FLAG_FULLSCREEN 
           | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 
    } 
} 

Google cho biết "sau một vài giây" - nhưng tôi muốn cung cấp chức năng này càng sớm càng tốt. Có lẽ tôi sẽ thay đổi giá trị sau, nếu tôi phải, tôi sẽ cập nhật câu trả lời này.

+1

Vâng đây là cách khủng khiếp nhất để làm, nhưng google nên sử dụng theo cách như vậy .. Thực sự họ không thể cung cấp một cách tốt để làm cái này? Thật là một kẻ ngu ngốc –

+0

Tôi đang ở bên bạn. Có lẽ nền tảng này cung cấp giải pháp tốt hơn ngay bây giờ. –

+0

Tôi sợ không ... Tôi hiện đang cố gắng tìm nhưng không có cách nào ... chỉ cần Google dành nhiều thời gian để cung cấp apis thực sự hữu ích –

12

Bạn có thể ẩn thanh điều hướng, chỉ cần gọi phương pháp này trên onCreate() của bạn,

public void FullScreencall() { 
    if(Build.VERSION.SDK_INT < 19){ 
     View v = this.getWindow().getDecorView(); 
     v.setSystemUiVisibility(View.GONE); 
    } else { 
      //for higher api versions.  
     View decorView = getWindow().getDecorView(); 
     int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; 
     decorView.setSystemUiVisibility(uiOptions); 
    } 
} 

này sẽ ẩn toàn bộ panel.hope nagiation nó giúp bạn

+1

Xin chào, dù sao để ẩn các nút sau khi tiêu điểm đầu vào trong một chế độ xem web hiển thị từ khóa? – Patrick

+1

Nó không phải là vĩnh viễn! –

+0

Typo? nhận xét nên nói // cho API cao hơn – user1010160

0

Từ Google tài liệu:

Bạn có thể ẩn thanh điều hướng trên Android 4.0 trở lên bằng cờ SYSTEM_UI_FLAG_HIDE_NAVIGATION. đoạn này ẩn cả hai thanh điều hướng và thanh trạng thái:

View decorView = getWindow().getDecorView(); 
// Hide both the navigation bar and the status bar. 
// SYSTEM_UI_FLAG_FULLSCREEN is only available on Android 4.1 and higher, but as 
// a general rule, you should design your app to hide the status bar whenever you 
// hide the navigation bar. 
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 
       | View.SYSTEM_UI_FLAG_FULLSCREEN; 
decorView.setSystemUiVisibility(uiOptions); 

http://developer.android.com/training/system-ui/navigation.html

+0

Nó không phải là vĩnh viễn. –

2

Bắt đầu bằng cách trốn trong OnResume() của hoạt động này sau đó cũng giữ ẩn như hình dưới đây:

decorView.setOnSystemUiVisibilityChangeListener 
       (new View.OnSystemUiVisibilityChangeListener() { 
        @Override 
        public void onSystemUiVisibilityChange(int visibility) { 
         // Note that system bars will only be "visible" if none of the 
         // LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set. 
         if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) { 
          //visible 
          hideSystemUI(); 
         } 
        } 
        } 
       });` 

    public void hideSystemUI() { 
     // Set the IMMERSIVE flag. 
     // Set the content to appear under the system bars so that the content 
     // doesn't resize when the system bars hide and show. 
     decorView.setSystemUiVisibility(
       View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
         | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
         | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 
         | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar 
         | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar 
         | View.SYSTEM_UI_FLAG_IMMERSIVE); 
    } 
0

Giải pháp của tôi, để chỉ ẩn thanh điều hướng, là:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    final View decorView = getWindow().getDecorView(); 
    decorView.setOnSystemUiVisibilityChangeListener (new View.OnSystemUiVisibilityChangeListener() { 
     @Override 
     public void onSystemUiVisibilityChange(int visibility) { 
      if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) { 
       decorView.setSystemUiVisibility(
         View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
           | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
           | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 
           | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 
      } 
     } 
    }); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    final int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; 
    final View decorView = getWindow().getDecorView(); 
    decorView.setSystemUiVisibility(uiOptions); 
} 
+0

bạn lấy 'getWindow()' ở đâu? Cuối cùng tôi nói: ** Không thể đọc biểu tượng getWindow(). ** –