Làm cách nào để lấy Thanh công cụ khỏi mảnh?


107

Tôi có ActionBarActivitybằng NavigationDrawervà sử dụng support_v7 Toolbarnhư ActionBar. Trong một trong những thanh công cụ phân mảnh của tôi có chế độ xem tùy chỉnh. Trong các đoạn khác Toolbarnên hiển thị tiêu đề.

Làm thế nào để có được Toolbarphiên bản để tùy chỉnh từ các mảnh? Tôi có thể lấy ActionBar bằng getActivity().getActionBar(), nhưng nếu tôi gọi setTitle()ActionBar trường hợp này thì nó không làm gì cả.

CẬP NHẬT:

Trong trường hợp của tôi

((ActionBarActivity) getActivity()).getSupportActionBar().setTitle();

(như MrEngineer13 đã nói) không hoạt động khi tạo phân đoạn đầu tiên vì tôi gọi nó từ onHiddenChanged (). Bây giờ tôi thêm một cái nữa vào onCreateView () và nó hoạt động tốt.


mảnh vỡ không có actionbars / thanh công cụ hoạt động làm
tyczj

(MainAcivity) this.getActivity ()). GetToolbar (); sẽ là câu trả lời phù hợp !! để nhận được Thanh công cụ ở dạng phân mảnh !!
LOG_TAG

Câu trả lời:


201

Bạn cần truyền hoạt động của mình từ đầu tiên getActivity()sang hoạt động AppCompatActivityđầu tiên. Đây là một ví dụ:

((AppCompatActivity) getActivity()).getSupportActionBar().setTitle();

Lý do bạn phải truyền nó là vì getActivity()trả về a FragmentActivityvà bạn cầnAppCompatActivity

Trong Kotlin:

(activity as AppCompatActivity).supportActionBar?.title = "My Title"

8
nhận được 'supportActionBar' và 'thanh công cụ' có giống nhau không?
Darpan

@Darpan không chắc
Konstantin Konopko

Nếu tôi thêm cái này, nó sẽ thay đổi tiêu đề .. Nhưng nếu tôi quay lại hoạt động chính, làm thế nào để thay đổi lại tiêu đề? Ý tôi là tôi có một ngăn kéo điều hướng. Ngăn bên có một số mảnh và hoạt động chính có tiêu đề riêng. Khi tôi đặt tiêu đề của hoạt động chính, nó hoạt động và theo từng mảng, cách bạn đã đề cập hoạt động hoàn hảo. Nhưng làm cách nào để thay đổi tiêu đề của hoạt động đang quay trở lại?
Kylo Ren

82

Trong trường hợp các phân đoạn phải có dạng xem tùy chỉnh của ToolBar, bạn có thể triển khai ToolBar cho từng phân đoạn riêng biệt.

thêm ToolBar vàogment_layout:

<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimaryDark"/>

tìm nó trong mảnh:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment, container, false);
        Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);

        //set toolbar appearance
        toolbar.setBackground(R.color.material_blue_grey_800);

        //for crate home button
        AppCompatActivity activity = (AppCompatActivity) getActivity();
        activity.setSupportActionBar(toolbar);
        activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

Trình nghe menu có thể được tạo theo hai cách: ghi đè onOptionsItemSelected trong phân đoạn của bạn:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()){
        case android.R.id.home:
            getActivity().onBackPressed();
    }
    return super.onOptionsItemSelected(item);
}

hoặc đặt trình xử lý cho thanh công cụ khi tạo nó trong onCreateView ():

toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem menuItem) {
                return false;
            }
        });

1
Tôi chỉ muốn xác nhận điều này đúng cách để làm? nếu chúng tôi tải phân đoạn khác nhau bằng thanh công cụ trong viewpager + Tablayout hoặc Pagertabstripe, nó sẽ ảnh hưởng đến hiệu suất ứng dụng trong khi vuốt?
LOG_TAG

1
@LOG_TAG Tôi có một thiết kế ngăn kéo với mỗi phân đoạn triển khai thanh công cụ (và do đó có một thanh công cụ trong tệp bố cục của nó) và đoạn mã trên rất hiệu quả đối với tôi.
MattBoothDev

Cảm ơn! Làm việc như HEYUL !! :) Btw, tốt hơn nên ghi đè Activity của mẹ onOptionsItemSelected()thay vì của Fragment, để tránh lặp lại mã.
Aditya Naique

@ChadMx không, tại sao anh ấy thậm chí còn viết về việc thêm thanh công cụ trong xml, v.v. Tác giả hỏi làm thế nào để lấy thanh công cụ theo lập trình từ phân mảnh. Vì vậy, stackoverflow.com/a/26998718/4548520 đây là câu trả lời đúng nhất / đúng và nó ngắn gọn
25

43

Bạn có hai lựa chọn để tải Thanh công cụ trong phân đoạn

Đầu tiên

Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);

và cái thứ hai

Toolbar toolbar = ((MainActivity) getActivity()).mToolbar;

Nhưng đây có phải là cách đúng đắn .. bcoz chúng ta cũng có getSupportedActionBar?
Code_Life

9
toolbar = (Toolbar) getView().findViewById(R.id.toolbar);
AppCompatActivity activity = (AppCompatActivity) getActivity();
activity.setSupportActionBar(toolbar);

2

Đối với người dùng Kotlin (activity as AppCompatActivity).supportActionBar?.show()


!!là hoàn toàn có thể tránh được với ?và nó sẽ giúp bạn tiết kiệm một vụ tai nạn có thể
JonZarate

Tôi tin rằng đây là tốt hơn(activity as? AppCompatActivity)?.supportActionBar?.show()
JonZarate

1

Có lẽ bạn phải thử getActivity().getSupportActionBar().setTitle()nếu bạn đang sử dụng support_v7.


1

Từ phân mảnh của bạn: (lấy Thanh công cụ từ phân mảnh?)

// get toolbar
((MainAcivity)this.getActivity()).getToolbar();  // getToolbar will be method in Activity that returns Toolbar!!  don't use getSupportActionBar for getting toolbar!!
// get action bar
this.getActivity().getSupportActionBar();

điều này rất hữu ích khi bạn đang sử dụng spinner trong Thanh công cụ và gọi spinner hoặc các dạng xem tùy chỉnh trong Thanh công cụ từ một đoạn!

Từ Hoạt động của bạn:

// get toolbar
this.getToolbar();
// get Action Bar
this.getSupportActionBar();

3
Bạn phải có một phương thức trong hoạt động của mình được gọi là getToolbar () , điều này không tốt, vì đó không phải là cách giao tiếp giữa hoạt động và phân mảnh nên được thực hiện.
Marko

2
vâng không có cách nào khác cho việc này !! nhiều libs ngăn điều hướng chỉ thực hiện phong cách này !!! đôi khi chúng ta cần truyền hoạt động vì AppCompatActivity (AppCompatActivity) getActivity () đó là một điểm đau khác !!! tất cả những thứ này hoàn toàn giết chết thời gian của nhà phát triển :(
LOG_TAG

1

Trong XML

 <androidx.appcompat.widget.Toolbar
  android:id="@+id/main_toolbar"
  android:layout_width="match_parent"
  android:layout_height="?attr/actionBarSize"
  app:layout_scrollFlags="scroll|enterAlways">
 </androidx.appcompat.widget.Toolbar>

Kotlin: Tronggment.kt -> onCreateView ()

setHasOptionsMenu(true)

val toolbar = view.findViewById<Toolbar>(R.id.main_toolbar)

(activity as? AppCompatActivity)?.setSupportActionBar(toolbar)

(activity as? AppCompatActivity)?.supportActionBar?.show()

-> onCreateOptionsMenu ()

   override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
       inflater.inflate(R.menu.app_main_menu,menu)
       super.onCreateOptionsMenu(menu, inflater)
   }

-> onOptionsItemSelected ()

   override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return when (item.itemId) {
             R.id.selected_id->{//to_do}
             else -> super.onOptionsItemSelected(item)
        }
    }

0

Tôi đã làm điều đó bằng cách sử dụng các bước sau.

  1. Đặt Tiêu đề bằng cách sử dụng mã bên dưới trong onCreateViewphân đoạn chính.
((AppCompatActivity) getActivity()).getSupportActionBar().setTitle("Your title");
  1. Để hoán đổi giữa các phân đoạn, tôi đang sử dụng thanh điều hướng dưới cùng được triển khai trên MainActivity(Hoạt động chính) của phân đoạn. Ngay cả khi bạn đang sử dụng bất kỳ nút hoặc mục menu nào thì bạn có thể thay đổi tiêu đề từ đó onSelectedItemClickListener, giống như tôi đã làm trong trường hợp của mình.
    public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
        switch (menuItem.getItemId()){
            case R.id.menu_dashboard:
                getSupportActionBar().setTitle("Dashboard");
                fm.beginTransaction().hide(active).show(dashboardFragment).commit();
                active = dashboardFragment;
                return true;
            case R.id.menu_workshop:
                getSupportActionBar().setTitle("Workshops");
                fm.beginTransaction().hide(active).show(workshopFragment).commit();
                active = workshopFragment;
                return true;
         }
         return false;
    }

0

nếu bạn đang sử dụng thanh công cụ tùy chỉnh hoặc ActionBar và bạn muốn tham chiếu thanh công cụ / thanh hành động của mình từ Fragment thì trước tiên bạn cần lấy phiên bản Hoạt động chính của mình từ Phương thức onCreateView của Fragment như bên dưới.

MainActivity activity = (MainActivity) getActivity();

sau đó sử dụng hoạt động để triển khai thêm như bên dưới

ImageView vRightBtn = activity.toolbar.findViewById(R.id.toolbar_right_btn);

Trước khi gọi cái này, bạn cần khởi tạo thanh công cụ tùy chỉnh của mình trong MainActivity như bên dưới.

Tập hợp đầu tiên xác định thanh công cụ của bạn công khai như

public Toolbar toolbar;
public ActionBar actionBar;

và trong phương thức onCreate () gán id thanh công cụ tùy chỉnh

toolbar = findViewById(R.id.custom_toolbar);
setSupportActionBar(toolbar);
actionBar = getSupportActionBar();

Đó là nó. Nó sẽ hoạt động trong Fragment.

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.