조각에서 툴바를 얻는 방법?


107

나는이 ActionBarActivity함께 NavigationDrawer하고 사용 support_v7 Toolbar액션 바있다. 내 조각 도구 모음 중 하나에 사용자 정의보기가 있습니다. 다른 조각 Toolbar에서는 제목이 표시되어야합니다.

Toolbar프래그먼트에서 커스터마이징을위한 인스턴스를 얻으려면 어떻게해야 합니까? 으로 ActionBar를 얻을 수 getActivity().getActionBar()있지만 setTitle()이 인스턴스 ActionBar를 호출 하면 아무 작업도 수행하지 않습니다.

UPD :

나의 경우에는

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

(MrEngineer13이 말했듯이) onHiddenChanged ()에서 호출하기 때문에 처음 조각 생성시 작동하지 않습니다. 이제 onCreateView ()에 하나를 더 추가하면 제대로 작동합니다.


조각에는 작업 표시 줄 / 도구 모음 활동이 없습니다
tyczj

(MainAcivity) this.getActivity ()). getToolbar (); 정답이 될 것입니다 !! 툴바를 조각으로 가져 오기 위해 !!
LOG_TAG

답변:


201

활동을 getActivity()에서 AppCompatActivity처음 으로 캐스팅해야합니다 . 예를 들면 다음과 같습니다.

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

캐스팅 해야하는 이유 getActivity()는 a를 반환 FragmentActivity하고AppCompatActivity

Kotlin에서 :

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

8
'supportActionBar'와 'toolbar'를 얻는 것은 같은 것입니까?
Darpan

확실하지 @Darpan
콘스탄틴 Konopko에게

이걸 추가하면 제목이 바뀝니다.하지만 부모 활동으로 돌아 가면 어떻게 다시 제목을 바꾸나요? 내비게이션 서랍이 있습니다. 측면 서랍에는 일부 조각이 있으며 주요 활동에는 자체 제목이 있습니다. 내가 주요 활동의 제목을 설정하면 작동하고 단편적으로 말한 방식이 완벽하게 작동했습니다. 그러나 돌아가는 활동의 제목을 어떻게 변경해야합니까?
Kylo Ren

82

조각에 ToolBar의 사용자 지정보기가 있어야하는 경우 각 조각에 대해 ToolBar를 개별적으로 구현할 수 있습니다.

fragment_layout에 ToolBar를 추가합니다.

<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"/>

조각에서 찾으십시오.

@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);
}

메뉴 리스너는 두 가지 방법으로 만들 수 있습니다. 조각에서 onOptionsItemSelected를 재정의합니다.

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

또는 onCreateView ()에서 도구 모음을 만들 때 리스너를 설정합니다.

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

1
이것이 올바른 방법인지 확인하고 싶습니까? viewpager + Tablayout 또는 Pagertabstripe에서 툴바로 다른 조각을로드하면 스 와이프하는 동안 앱 성능에 영향을 미칠까요?
LOG_TAG

1
@LOG_TAG 각 조각이 도구 모음을 구현하는 서랍 디자인 (따라서 레이아웃 파일에 도구 모음이 있음)이 있으며 위 코드는 저에게 잘 맞았습니다.
MattBoothDev

감사! HEYUL처럼 일 했어 !! :) Btw, onOptionsItemSelected()코드 반복을 피하기 위해 조각 대신 부모 활동을 재정의하는 것이 좋습니다 .
아 디트 Naique

@ChadMx 아니, 왜 그는 xml에 툴바를 추가하는 것에 대해 썼습니다. 작성자는 fragment에서 프로그래밍 방식으로 툴바를 가져 오는 방법을 물었습니다. 따라서 stackoverflow.com/a/26998718/4548520 이것이 최선의 / 정답이며 짧습니다
user25

43

도구 모음을 조각으로 만들려면 두 가지 선택이 있습니다.

첫 번째

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

그리고 두 번째

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

그러나 이것이 올바른 방법입니까 .. bcoz 우리는 또한 getSupportedActionBar를 가지고 있습니까?
Code_Life

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

2

Kotlin 사용자의 경우 (activity as AppCompatActivity).supportActionBar?.show()


!!함께 completly 피할 수 ?그것은 당신에게 가능한 충돌을 절약 할 수
JonZarate

나는 이것이 더 생각(activity as? AppCompatActivity)?.supportActionBar?.show()
JonZarate

1

getActivity().getSupportActionBar().setTitle()support_v7을 사용하는 경우 시도 해야 할 수도 있습니다 .


1

조각에서 : ( 조각 에서 툴바를 가져 오시겠습니까?)

// 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();

이것은 툴바에서 스피너를 사용 하고 조각에서 툴바 의 스피너 또는 사용자 정의 를 호출 할 때 매우 유용합니다 !

활동에서 :

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

3
활동에 getToolbar () 라는 메소드가 있어야합니다 . 이는 활동과 프래그먼트 간의 통신이 수행되는 방식이 아니기 때문에 좋지 않습니다.
Marko

2
네, 다른 방법은 없습니다 !! 많은 탐색 창 라이브러리는이 스타일 만 구현합니다 !!! AppCompatActivity (AppCompatActivity) getActivity () 때문에 활동을 캐스팅해야 할 때가 있습니다. 이 모든 물건은 완전히 :( dev에 시간을 죽이기
LOG_TAG

1

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 : fragment.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

이 단계를 사용하여 수행했습니다.

  1. onCreateView메인 프래그먼트의 아래 코드를 사용하여 Title을 설정 합니다.
((AppCompatActivity) getActivity()).getSupportActionBar().setTitle("Your title");

  1. 조각 간 스왑을 위해 조각의 MainActivity(부모 활동)에 구현 된 하단 탐색 모음을 사용 하고 있습니다. 아무 버튼이나 메뉴 항목을 사용하더라도 onSelectedItemClickListener제 경우처럼 제목을에서 변경할 수 있습니다 .
    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

사용자 정의 도구 모음 또는 ActionBar를 사용 하고 있고 Fragments에서 도구 모음 / 작업 모음의 참조를 얻으려면 먼저 아래와 같이 Fragment의 onCreateView 메서드 에서 기본 활동의 인스턴스를 가져와야 합니다.

MainActivity activity = (MainActivity) getActivity();

그런 다음 아래와 같은 추가 구현을 위해 활동을 사용하십시오.

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

이것을 호출하기 전에 아래와 같이 MainActivity에서 사용자 정의 도구 모음을 초기화해야합니다.

첫 번째 세트는 다음과 같이 툴바 공개를 정의합니다.

public Toolbar toolbar;
public ActionBar actionBar;

및에 에서 onCreate () 메소드 사용자 지정 도구 모음 ID를 할당

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

그게 다야. Fragment에서 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.