프래그먼트 내부의 onCreateOptionsMenu


182

setHasOptionsMenu(true)안에 넣었 onCreateView지만 여전히 onCreateOptionsMenu조각 내부를 호출 할 수 없습니다 .

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
                         Bundle savedInstanceState) {   
   setHasOptionsMenu(true);             
   return inflater.inflate(R.layout.facesheet, container, false);
}

아래는 내 onCreateOptionsMenu코드입니다.

@Override
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
    getSupportMenuInflater().inflate(R.menu.layout, menu);
    return (super.onCreateOptionsMenu(menu));
}

내가 얻는 오류 메시지 :

방법 onCreateOptionsMenu(Menu)유형 조각은 무시하거나 슈퍼 방법을 구현해야합니다.


1
'setHasOptionsMenu (true);'에 감사드립니다.
Fabricio PH

답변:


497

이 시도,

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_sample, menu);
    super.onCreateOptionsMenu(menu,inflater);
}

그리고이 onCreate줄을 추가하여 옵션이Toolbar

setHasOptionsMenu(true);

182
이 행을 추가하지 않으면 호출되지 않습니다.setHasOptionsMenu(true);
Yoann Hercouet

10
프래그먼트의 onCreateOptionsMenu ()는 활동과 다른 인수를 갖습니다.
Jorge

3
또한 위의 ans에서 언급 한 활동에서 onCreateOptionsMenu ()의 부울과 달리 void와 다른 반환 유형입니다.
Dexter

4
재미있는 참고 사항 : 포함하는 활동에서 onCreateOptionsMenu를 재정의하면 두 옵션 메뉴 항목이 모두 표시됩니다.
Adam Johns

5
setHasOptionsMenu(true);onCreate()완료 되려면 호출 해야합니다.
Roel

21

귀하의 이미 자동 생성 한 파일 고해상도 / 메뉴 / menu.xml 정의 action_settings을 .

당신에 MainActivity.java 다음과 같은 방법이있다 :

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    switch (id) {
        case R.id.action_settings:
            // do stuff, like showing settings fragment
            return true;
    }

    return super.onOptionsItemSelected(item); // important line
}

에서 onCreateView()당신의 조각 호출 방법 :

setHasOptionsMenu(true); 

또한이 두 가지 방법을 추가하십시오 :

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.fragment_menu, menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    switch (id) {
        case R.id.action_1:
            // do stuff
            return true;

        case R.id.action_2:
            // do more stuff
            return true;
    }

    return false;
}

마지막으로 action_1action_2를 정의하는 res / menu / fragment_menu.xml 파일을 추가하십시오 .

이 방법으로 앱에 Fragment가 표시되면 메뉴에 3 개의 항목이 포함됩니다.

  • action_1 에서 고해상도 / 메뉴 / fragment_menu.xml
  • action_2 에서 고해상도 / 메뉴 / fragment_menu.xml
  • action_settings 에서 고해상도 / 메뉴 / menu.xml

1
문제는 활동이 아니라 조각 내부에 있었다
OlivierM

2
@OlivierM 대답은 조각 메뉴를 설명합니다. 활동 메뉴와 상호 작용하는 방법에 대한 설명에 감사했습니다.
Aranda

13

@Alexander Farber와 @Sino Raj 답변을 시도했습니다. 두 답변 모두 훌륭하지만 누락 된 것을 발견 할 때까지 조각 내에서 onCreateOptionsMenu를 사용할 수 없었습니다.

내 활동에 다음과 같이 setSupportActionBar (toolbar)를 추가하십시오.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.id.activity_main);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
}

이 답변이 같은 문제를 가진 사람에게 도움이되기를 바랍니다.


4

요구

setSupportActionBar(toolbar)

내부

onViewCreated(...) 

파편

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
    ((MainActivity)getActivity()).setSupportActionBar(toolbar);
    setHasOptionsMenu(true);
}

1
 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.activity_add_customer, container, false);
        setHasOptionsMenu(true);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_sample, menu);
    super.onCreateOptionsMenu(menu,inflater);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.