Làm cách nào để khai báo Thanh công cụ / Thanh tác vụ có chiều cao mở rộng trên Android Lollipop?


88

Tôi đã thấy thanh ứng dụng có chiều cao mở rộng trong nguyên tắc Thanh ứng dụng thiết kế của Google . Làm cách nào để triển khai những điều này trong Android Lollipop?

Câu trả lời:


144

Bạn cần sử dụng tiện ích Thanh công cụ mới để đạt được điều này. Thanh công cụ có cách xử lý đặc biệt đối với chiều cao tối thiểu của nó để khai báo lượng không gian được sử dụng cho các nút (và hành động).

Trong ví dụ dưới đây, chúng tôi đang đặt chiều cao là 128dp (là 56dp + 72dp như được xác định trong thông số kỹ thuật), nhưng giữ nguyên android:minHeightlàm tiêu chuẩn actionBarSize(thường là 56dp). Điều này có nghĩa là các nút và hành động bị hạn chế đặt theo chiều dọc ở 56dp trên cùng. Sau đó chúng ta có thể sử dụng android:gravityđể định vị tiêu đề ở dưới cùng.

<Toolbar
    android:id="@+id/toolbar"
    android:layout_height="128dp"
    android:layout_width="match_parent"
    android:minHeight="?android:attr/actionBarSize"
    android:background="?android:attr/colorPrimary"
    android:gravity="bottom" />

Nếu bạn đang sử dụng AppCompat, hãy thay đổi khai báo để sử dụng android.support.v7.widget.Toolbarthay thế và sử dụng các thuộc tính của nó.


3
Nếu sử dụng layout_heightlà cách để đi, tôi mong đợi cách giải quyết được mô tả bởi gió mùa ở đây cũng không phải là một cách giải quyết, mà là cách thích hợp để đi? code.google.com/p/android/issues/detail?id=77874
Thomas Keller

3
Tôi cũng muốn khai báo các biểu thức cho thứ nguyên, nhưng chúng tôi không thể.
Chris Banes

37
Đối với điểm thưởng, kích thước thanh hành động sử dụng gia tăng, ví dụ @dimen/action_bar_size_x2, và sử dụng 112dp trên điện thoại, 128dp trên máy tính bảng
Roman Nurik

7
android:paddingBottomgiới thiệu khoảng cách lạ khi buttonGravityđược đặt thành bottom. Các titleMarginBottomthuộc tính có vẻ như lựa chọn tốt hơn ở đây, đúng không?
Paul Burke

5
@RomanNurik làm cách nào để thanh công cụ mở rộng trong ứng dụng lịch hoạt động? Bất kỳ gợi ý nào
Raghunandan

3

Cảm ơn câu hỏi của bạn, câu trả lời của nó và hơn thế nữa cho việc triển khai thanh công cụ trong thư viện gốc và thư viện hỗ trợ :)

Và chúng tôi có thể chơi nhiều hơn. Chúng tôi có thể, trong thời gian chạy, chơi với Chiều cao và Chiều cao tối thiểu.

Chiều cao là chiều cao ToolBar, nó đơn giản, mọi cơ thể đều hiểu, và trọng lực tác động theo chiều cao đó.

Chiều cao tối thiểu phức tạp hơn và không nên ở mức tối thiểu 56dp. MinHeight này được sử dụng để đặt dòng menuItem của bạn. Dòng này nằm ở điểm giữa của minHeight của bạn.

Vì vậy, bạn có thể thêm mã này vào hoạt động của mình để tự mình thấy sự khác biệt. :)

Runnable toolBarAnimator=new Runnable() {
        @Override
        public void run() {
            if(postICS){
//                toolbar.setTranslationX(iteration);
//                toolbar.setElevation(iteration);
                toolbar.setMinimumHeight(iteration * 5);
                toolbar.getLayoutParams().height++;
            }
            uiThreadHanlder.postDelayed(this,16);
            iteration++;
            if(iteration>150)iteration=0;
        }
    };
    Handler uiThreadHanlder=new Handler();
    int iteration=0;


    @Override
    protected void onResume() {
        super.onResume();
        //launch the animation
        uiThreadHanlder.postDelayed(toolBarAnimator, 1000);
    }


    @Override
    protected void onPause() {
        super.onPause();
        //stop the animation
        uiThreadHanlder.removeCallbacks(toolBarAnimator);
    }

Thanh công cụ ở đâu:

toolbar = (Thanh công cụ) findViewById (R.id.toolbar);

Khi làm điều này, bạn nhận được: nhập mô tả hình ảnh ở đây

nhưng nếu bạn vẫn tiếp tục hoạt ảnh, bạn sẽ có: nhập mô tả hình ảnh ở đây

Đây là lý do tại sao, đặt thanh công cụ của bạn android: layout_height thành wrap_content là một lựa chọn tốt trong hầu hết các trường hợp, vì Thanh công cụ sẽ điều chỉnh chiều cao của nó theo nội dung của nó (và bạn có thể thay đổi nội dung trong thời gian chạy :)

Và đây cũng là cách bạn thay đổi kích thước thanh công cụ của mình trong thời gian chạy.

Cảm ơn Chris Banes vì ​​công việc tuyệt vời mà bạn đã làm trên thanh hành động.


@MohammadHadi Tôi tưởng tượng rằng postICS sẽ được xác định một cái gì đó như:boolean postICS = Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN;
dm78
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.