2013-07-20 39 views
13

Tôi có một ViewPager và FragmentPagerAdapter được thiết lập trong một hoạt động với 3 đoạn. Tất cả các đoạn được tải đồng thời và được lưu trong bộ nhớ bằng cách sử dụngTạo các phân đoạn toàn màn hình theo chương trình

mPager.setOffscreenPageLimit(2); 

Một trong những đoạn này lưu trữ bản xem trước máy ảnh mà tôi muốn làm toàn màn hình, không có thanh trạng thái hoặc thanh tác vụ. Các mảnh khác yêu cầu thanh tác vụ được hiển thị.

Làm cách nào để chỉ hiển thị toàn bộ đoạn xem trước của camera trong khi vẫn giữ hai đoạn còn lại bình thường? Tôi đã thử sử dụng các chủ đề, có nghĩa là phá vỡ thanh hành động.

lập trình gọi sau đây không được, vì nó buộc toàn bộ hoạt động được toàn màn hình (và do đó hai mảnh còn lại cùng với nó):

requestWindowFeature(Window.FEATURE_NO_TITLE); 
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
setContentView(R.layout.main); 

Tôi cũng đã cố gắng thực hiện ViewPager.OnPageChangeListener:

public void onPageSelected(int position) { 
    if(position == 1) 
     getActionBar().hide(); 
    else 
     getActionBar().show(); 
} 

Điều này ẩn thanh tác vụ nhưng không ẩn thanh trạng thái hệ thống (Tôi đang nói về vị trí thông báo, biểu tượng trạng thái và thời gian) và thanh tác vụ ẩn/hiển thị hoạt ảnh cũng rất hay thay đổi khi vuốt.

Ví dụ về những gì tôi muốn làm chính xác, hãy xem Snapchat - họ quản lý để kéo ra khỏi swiping giữa máy ảnh và các mảnh hoàn hảo.

Edit:

Vì vậy, tôi đã thay đổi onPageSelected này của tôi:

public void onPageSelected(int position) { 
    if(position == 1) { 
     MainActivity.this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     MainActivity.this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); 
    } else { 
     MainActivity.this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     MainActivity.this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); 
    } 
} 

Điều này cho phép tôi thay đổi cho dù thanh trạng thái được hiển thị hay không. Tuy nhiên, nó gây ra một số lượng lớn jank. Cùng một vấn đề với thanh hành động.

Tôi nhận thấy rằng trong Snapchat thanh trạng thái sẽ trượt lên và xuống sau khi thay đổi tab hoàn tất. Tôi không chắc chắn làm thế nào để thực hiện điều này, vì vậy bất kỳ lời khuyên về khía cạnh này sẽ được đánh giá cao.

Trả lời

11

Tôi đã tìm ra cách để thực hiện điều này, mặc dù nó chắc chắn là một hack.

Bí quyết không phải là sử dụng thanh tác vụ Android, nó là của riêng bạn trong tệp bố cục của bạn.

tôi xác định hai RelativeLayouts hơn trong mã của tôi:

<RelativeLayout 
    android:id="@+id/padding" 
    android:layout_width="fill_parent" 
    android:layout_height="25dip" 
    android:layout_alignParentTop="true" 
    android:background="@color/abs__background_holo_dark" /> 

<RelativeLayout 
    android:id="@+id/fake_action_bar" 
    android:layout_width="fill_parent" 
    android:layout_height="48.0dip" 
    android:layout_below="@id/padding" > 

<!-- stuff here --> 

</RelativeLayout> 

Các RelativeLayout đầu là đệm cho thanh trạng thái Android.Tôi đặt nó thành 25dip, nhưng nó có thể khác nhau - có lẽ tốt nhất là đặt giá trị này theo lập trình. Ngoài ra, bạn cần phải đặt nó thành một màu đen để nó phù hợp với màu sắc thanh trạng thái và làm cho giao diện người dùng trông tự nhiên hơn.

Phía dưới RelativeLayout là dành cho thanh tác vụ giả mạo của bạn. Bạn cần phải nhồi nhét mọi thứ mà thanh tác vụ của bạn cần (văn bản tiêu đề, nút, v.v.) trong RelativeLayout này. Tôi đặt nó thành 48dip, nhưng một lần nữa, điều này sẽ thay đổi và bạn có lẽ nên đặt nó theo chương trình.

Trong Hoạt động lưu trữ Những mảnh vỡ của bạn, ViewPager và FragmentPagerAdapter, bạn cần phải thiết lập các cờ bảo Android để làm cho tình trạng thanh lớp phủ:

WindowManager.LayoutParams params = getWindow().getAttributes(); 
params.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; 

Bây giờ chúng ta cần phải làm cho ẩn thanh trạng thái và hiển thị khi chúng tôi chuyển đổi các mảnh. Đã hoạt động của bạn thực hiện ViewPager.OnPageChangeListener và sau đó sử dụng đoạn mã sau:

@Override 
public void onPageScrollStateChanged(int state) { 
    switch(state) { 
    case ViewPager.SCROLL_STATE_IDLE: 
     if(mPosition == 1) { 
      getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 
      getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); 
     } else { 
      getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 
      getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); 
     } 
    } 
} 

@Override 
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

} 

@Override 
public void onPageSelected(int position) { 
    mPosition = position; 
} 

Chúng tôi theo dõi các số trang sử dụng onPageSelected và sử dụng nó trong onPageScrollStateChanged để tự động ẩn/hiển thị thanh trạng thái tùy thuộc vào Fragment hiện đang được hiển thị. Bạn không thể làm điều này trong onPageSelected bởi vì điều này sẽ làm cho thanh trạng thái để tái xuất hiện nửa chừng thông qua một swipe.

Bạn cũng cần đảm bảo thêm mã thích hợp cho thanh tác vụ giả mạo của mình - đối với các nút, đây sẽ là OnClickListener.

2

Trước tiên, trong hoạt động/đoạn bạn muốn ẩn thanh trạng thái: Tạo một tĩnh công khai của đoạn.

public static Fragment QSFrag; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    QSFrag = this; 
} 

Sau đó, trong onPageSelected của bạn:

public void onPageSelected(int position) { 
     // TODO Auto-generated method stub 
     if(position == 1){ 
      mActionBar.hide();    


      YourActivityWithNoStatusOrActionBar.QSFrag.getActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 


     }else{ 

      mActionBar.show(); 
      // mActionBar.setSelectedNavigationItem(position); I use this, not sure u need/want it. 
     } 

    } 

Tôi vừa thử nghiệm nó, và nó hoạt động. Nhưng nó không trông tuyệt vời khi bạn rời khỏi mảnh không có thanh trạng thái. : p

+0

Tôi đã thử phiên bản sửa đổi này, giúp loại bỏ thanh trạng thái, nhưng nó cũng giống như điên –

+0

Ngoài ra, tôi vừa nhận ra rằng điều này có thể sẽ gây ra các ứng dụng bị lỗi nếu đoạn đã được tải xuống khỏi bộ nhớ do một trang vuốt hoặc nếu nó đã từng bị phá hủy và tái tạo, chẳng hạn như từ một sự thay đổi định hướng. Bạn sẽ cần phải lấy một tham chiếu đến đoạn bằng cách sử dụng findFragmentById(), vì tham chiếu cũ sẽ không hợp lệ –

+0

'mActionBar' là gì? –

0

Bạn có thể sử dụng mã này trong onCreate:

setTheme(android.R.style.Theme_Translucent_NoTitleBar_Fullscreen); 
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
if (getSupportActionBar() != null) { 
    getSupportActionBar().hide(); 
} 

Tôi hy vọng điều này giải quyết vấn đề của bạn. :)

Các vấn đề liên quan