조각에서 OnCreateOptionsMenu ()가 호출되지 않았습니다.


107

가로로 두 개의 조각이있는 하나의 활동이있는 앱이 있습니다.

내 활동에서 작업 onCreateOptionsMenu()표시 줄 옵션 메뉴를 표시 할 수있는 사용 하여 메뉴를 부풀 렸습니다. 그러나 내 조각 중 하나에서 작업 표시 줄 메뉴 항목을 업데이트하려고하면 onCreateoptionsmenu()이 호출되지 않습니다. 따라서 작업 표시 줄 옵션 메뉴를 업데이트 할 수 없습니다.

내 활동의 코드는 다음과 같습니다.

myActivity.java

package com.andr.androidtablelist;

import java.io.IOException;

import android.app.ActionBar;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;

import com.andr.fragments.ListLeftFragment;
import com.andr.utils.DBHelper;

      public class TabletActivity extends Activity {
    ActionBar actionBar = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        DBHelper dbhelper;
        dbhelper = new DBHelper(this);
        try {
            dbhelper.createDatabase();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        setContentView(R.layout.activity_tablet);
        actionBar = getActionBar();
        actionBar.setDisplayHomeAsUpEnabled(false);
        getFragmentManager().beginTransaction()
                .replace(R.id.master, ListLeftFragment.newInstance()).commit();
    }

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

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            Toast.makeText(
                    getApplicationContext(),
                    "Back Stack Count::"
                            + getFragmentManager().getBackStackEntryCount(),
                    Toast.LENGTH_LONG).show();
            if (getFragmentManager().getBackStackEntryCount() == 1) {
                actionBar.setDisplayHomeAsUpEnabled(false);
            }
            if (getFragmentManager().getBackStackEntryCount() > 1) {
                getFragmentManager().popBackStack();

            }
            return true;

        }
        return super.onOptionsItemSelected(item);
    }

}
      // http://www.vogella.com/articles/AndroidListView/article.html

myFragment.java

      package com.andr.fragments;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.TextView;

import com.andr.androidtablelist.R;
import com.andr.helper.LazyHelper;

   public class ListLeftFragment extends Fragment{
    private static ListLeftFragment listFragment = null;

    public static ListLeftFragment newInstance(){
        listFragment = new ListLeftFragment();      
        return listFragment;
    }

     @Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);


    }

     @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
         View v =  inflater.inflate(R.layout.fragment_listlayout, container,false);
         getActivity().invalidateOptionsMenu();
         ListView lv = (ListView)v.findViewById(R.id.lview);
         String[] values = new String[] { "Android", "iPhone", "WindowsMobile",
                    "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X",
                    "Linux", "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux",
                    "OS/2", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2",
                    "Android", "iPhone", "WindowsMobile" };
         getActivity().getActionBar().setTitle("LeftList");

          ArrayList<String> list = new ArrayList<String>();
         LazyHelper lHelper = new LazyHelper(getActivity());
         list = lHelper.getLazyDetials();

           /* for (int i = 0; i < values.length; ++i) {
              list.add(values[i]);
            }
            final StableArrayAdapter adapter = new StableArrayAdapter(getActivity(),
                android.R.layout.simple_list_item_1, list);*/
            LeftListAdapter lAdapter = new LeftListAdapter(getActivity(),list);
            lv.setAdapter(lAdapter);
            lv.setOnItemClickListener(new OnItemClickListener()
            {

                @Override
                public void onItemClick(AdapterView<?> arg0, View arg1,
                        int pos, long arg3) {
                    final String clickedData = (String)arg0.getItemAtPosition(pos);
                    Bundle bundle = new Bundle();
                    bundle.putString("clickedItemName", clickedData);
                    Fragment detailFragment = DetailFormRightFragment.newInstance();
                    detailFragment.setArguments(bundle);
                    getActivity().getFragmentManager().beginTransaction().replace(R.id.details, detailFragment).addToBackStack(null).commit();
                }

            }
                    );
         return v;
    }


     @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        getActivity().getMenuInflater().inflate(R.menu.search, menu);
        SearchView searchView=(SearchView)menu.findItem(R.id.search);
        searchView.setIconifiedByDefault(true);
    } 

     @Override
    public boolean onOptionsItemSelected(MenuItem item) {

         super.onOptionsItemSelected(item);
         return false;
    }


     @Override
    public void onPrepareOptionsMenu(Menu menu) {
         super.onPrepareOptionsMenu(menu);
        /*MenuItem item;
        menu.clear();
        getActivity().getMenuInflater().inflate(R.menu.search, menu);
        SearchView searchView=(SearchView)menu.findItem(R.id.search);
        searchView.setIconifiedByDefault(true);*/
    }

     private class StableArrayAdapter extends ArrayAdapter<String> {

            HashMap<String, Integer> mIdMap = new HashMap<String, Integer>();

            public StableArrayAdapter(Context context, int textViewResourceId,
                List<String> objects) {
              super(context, textViewResourceId, objects);
              for (int i = 0; i < objects.size(); ++i) {
                mIdMap.put(objects.get(i), i);
              }
            }

            @Override
            public long getItemId(int position) {
              String item = getItem(position);
              return mIdMap.get(item);
            }

            @Override
            public boolean hasStableIds() {
              return true;
            }

          }

     private class LeftListAdapter extends BaseAdapter implements OnClickListener {
         private Context mcontext;
         ArrayList<String> listData;
         private  LayoutInflater inflater=null;
         public LeftListAdapter(Context context, ArrayList<String> listItems) {
              mcontext=context;
              listData=listItems;
              inflater = (LayoutInflater)mcontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         }

        @Override
        public int getCount() {
            return listData.size();
        }

        @Override
        public Object getItem(int arg0) {
            return null;
        }

        @Override
        public long getItemId(int arg0) {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public View getView(int position, View view, ViewGroup arg2) {
            // create a ViewHolder reference
            View vi=view;
            if(vi==null){
                vi = inflater.inflate(R.layout.item, null);
            }
            TextView text=(TextView)vi.findViewById(R.id.text);
            text.setText(listData.get(position));
            vi.setOnClickListener(this);
            return vi;
        }

        @Override
        public void onClick(View vi) {
            TextView text=(TextView)vi.findViewById(R.id.text);
            Bundle bundle = new Bundle();
            bundle.putString("clickedItemName", text.getText().toString());
            Fragment detailFragment = DetailFormRightFragment.newInstance();
            detailFragment.setArguments(bundle);
            getActivity().getFragmentManager().beginTransaction().replace(R.id.details, detailFragment).addToBackStack(null).commit();          
        }

     }
   }

답변:


296

프래그먼트의 onCreateView()메서드에서 setHasOptionsMenu(true)프래그먼트에 추가하려는 메뉴 옵션이 있음을 호스트 활동에 알리기 위해 호출해야 합니다.


변경했지만 앱이 11-27 01 : 55 : 34.468 : E / AndroidRuntime (12294) : 원인 : java.lang.ClassCastException : com.android.internal.view.menu.MenuItemImpl을 android로 캐스팅 할 수 없습니다. .widget.SearchView
Android_programmer_office

그래 나는 문제를 발견했다. searchView에 getActionView ()를 추가하는 것을 잊었습니다.
Android_programmer_office 2013

2
또한 당신의 onCreateOptionsMenu (메뉴 메뉴, MenuInflater의 인플레이터)에 대한 무효 형을 사용해야하는 부울 유형하지 않습니다 일
바하 HANY

15
Toolbar활동 레이아웃에서 사용하는 경우 활동을 호출해야합니다 setSupportActionBar(your_toolbar). 그렇지 않으면 setHasOptionsMenu효과가 없습니다.
artkoenig

당신은 내 사랑 형제입니다 :)
Qadir Hussain

30

ActionBar를 지원 하지 않는 테마 를 사용하는 경우 모든 Java 코드를 올바르게 작성하더라도 OnCreateOptionsMenu ()가 자동으로 호출되지 않습니다.

AndroidManifest.xml을 열고 android : theme 값 을 "@android : style / Theme.Holo.Light.DarkActionBar"또는 ActionBar를 지원하는 다른 테마로 변경할 수 있습니다 .


... 어떤 옵션 메뉴 displayed..plz 도움을 나는 테마로 지원 라이브러리 및 Theme.AppCompat.Light.NoActionBar에서 도구 모음을 사용하지 않는, 그리고 난 같은 문제에 직면하고있다
Dhruvam 굽타

6
내가 호출하여 그것을 해결toolbar.inflateMenu(R.menu.menu_custom);
Dhruvam 굽타에게

활동에서 setSupportActionBar (mToolbar)를 호출하면 Fragments의 onCreateOptionsMenu가 자동으로 호출됩니다.
Vít Kapitola

12

이것은 나를 위해 일했다

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    setHasOptionsMenu(true);
    View view = inflater.inflate(R.layout.sample, null);
}

11

또한 전달하려는 툴바 인스턴스가

setSupportActionBar(toolbar);

null실제로 예외가 발생하지 않고 null내가 한 것처럼 몇 시간을 잃을 것이기 때문에 귀하의 활동에서는 아닙니다 .

ButterKnife 를 사용 하여 뷰를 바인딩했지만 setSupportActionBar(toolbar)실제로 호출하기 전에 실수로 배치 했습니다.ButterKnife.bind()


1
Haris, 당신은 대단합니다. 공유 해주셔서 감사합니다! Kotlin을 사용하고 있고 필요한 뷰를 얻기 위해 findViewById 등을 할 필요가 없기 때문에 정확한 문제가 발생했습니다.
DWndrer

1

프래그먼트에 생성자에 옵션 메뉴가 있음을 호스트 활동에 알리기 만하면됩니다.

public YourFragment () {setHasOptionsMenu (true);}

그것은 나를 위해 일했지만 @aldorain의 의견에서 언급했듯이 권장하지 않습니다.

응용 프로그램은 일반적으로 생성자를 구현하지 않아야합니다. 프래그먼트를 사용할 준비가 된 곳에서 애플리케이션 코드를 실행할 수있는 첫 번째 위치는 프래그먼트가 실제로 해당 활동과 연결되는 지점 인 onAttach (Activity)입니다.

따라서 대신 onCreateView () 또는 onAttach ()에 setHasOptionsMenu (true)를 넣으십시오.


사용자 정의 조각에 대한 자신의 생성자를 쓰기 야해
aldorain

1
developer.android.com/reference/android/app/Fragment.html tl; dr '애플리케이션은 일반적으로 [Fragment] 생성자를 구현해서는 안됩니다.'
aldorain

0

기본적으로 AppBar를 제공하지 않는 테마가 있고 대신이 기능을 제공하기 위해 도구 모음보기를 사용하고 있습니다. 조각.

그 후 onCreate () 조각 메서드에서 setHasOptionsMenu (true)를 호출합니다.

:)


-2

프래그먼트 setHasOptionsMenu(true)onCreateView()메서드를 설정합니다 .

@Override

 public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) 
 {
    Viewroot=inflater.inflate(R.layout.fragment_client_requestfragment,container,false);
  hideKeyboard();
    getemail = getArguments().getString("email_id");
    Log.e("email_id from activity",getemail);
    setHasOptionsMenu(true);
    return root;
}

1
안녕하세요, SO에 오신 것을 환영합니다. 주석이없고 형식이 잘못된 코드 전용 답변 만 게시하지 마십시오. 질문에 설명 된 문제가 정확히 무엇인지 설명하지 않습니다. 여기 에서 좋은 대답을 구성하는 몇 가지 일반적인 팁을 확인 하십시오 .
Gero
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.