안드로이드에서 조각에 옵션 메뉴를 추가하는 방법 extends Fragment {

조각 그룹에서 옵션 메뉴에 항목을 추가하려고합니다.

MenuFragment클래스를 만들고 메뉴 항목을 포함하려는 조각에 대해 이것을 확장했습니다. 코드는 다음과 같습니다.

자바:

public class MenuFragment extends Fragment {

    MenuItem fav;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }

    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        fav = menu.add("add");
        fav.setIcon(R.drawable.btn_star_big_off);
    }
}

코 틀린 :

class MenuFragment : Fragment {

    lateinit var fav: MenuItem

    override fun onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)
        setHasOptionsMenu(true)
    }

    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
        fav = menu.add("add");
        fav.setIcon(R.drawable.btn_star_big_off);
    }
}

어떤 이유로 인해 onCreateOptionsMenu실행되지 않는 것 같습니다.



답변

super 메소드를 호출하십시오.

자바:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        // TODO Add your menu entries here
        super.onCreateOptionsMenu(menu, inflater);
    }

코 틀린 :

    override fun void onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)
        setHasOptionsMenu(true)
    }

    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
        // TODO Add your menu entries here
        super.onCreateOptionsMenu(menu, inflater)
    }

코드에 로그 문을 넣어 메소드가 호출되지 않거나 메뉴가 메뉴에서 수정되지 않는지 확인하십시오.

또한 프래그먼트가 옵션 메뉴 처리에 참여해야 함을 알리기 위해 호출 setHasOptionsMenu(boolean)하고 있는지 확인하십시오 onCreate(Bundle).


답변

나는 같은 문제가 있었지만, 그것을 작동시키는 마지막 단계를 요약하고 소개하는 것이 낫다고 생각합니다.

  1. Fragment의 onCreate(Bundle savedInstanceState)메소드 에 setHasOptionsMenu (true) 메소드를 추가하십시오 .

  2. onCreateOptionsMenu(Menu menu, MenuInflater inflater)조각의 메뉴에서 다른 작업을 수행하려는 경우 조각의 재정 의 및 onOptionsItemSelected(MenuItem item)메서드.

  3. onOptionsItemSelected(MenuItem item)액티비티의 메소드 내 에서 메뉴 항목 조치가 onOptionsItemSelected(MenuItem item)프래그먼트의 메소드 로 구현 될 때 false를 리턴해야합니다 .

예를 들면 :

활동

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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {

        case R.id.activity_menu_item:

            // Do Activity menu item stuff here
            return true;

        case R.id.fragment_menu_item:

            // Not implemented here
            return false;
        default:
            break;
    }

    return false;
}

파편

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
    ....
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // Do something that differs the Activity's menu here
    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {

        case R.id.activity_menu_item:

            // Not implemented here
            return false;
        case R.id.fragment_menu_item:

            // Do Fragment menu item stuff here
            return true;

        default:
            break;
    }

    return false;
}


답변

onCreateOptionsMenu(Menu menu, MenuInflater inflater)메소드가 호출되지 않는 것을 발견 하면 Fragment의 onCreate(Bundle savedInstanceState)메소드 에서 다음을 호출하십시오 .

setHasOptionsMenu(true)


답변

당신이 필요한 경우 menu를 새로 webview특정 내부에 Fragment, 당신은 사용할 수 있습니다 :

조각 :

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

    // TODO Add your menu entries here
    inflater.inflate(R.menu.menu, menu);
    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.exit:
        System.exit(1);
        break;

    case R.id.refresh:
        webView.reload();
        break;
    }
    return true;

}

menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/exit" android:title="Exit" android:icon="@drawable/ic_action_cancel" />
    <item android:id="@+id/refresh" android:title="Refresh" android:icon="@drawable/ic_action_refresh" />
</menu>


답변

TL; DR

사용 android.support.v7.widget.Toolbar하고 그냥 하십시오 :

toolbar.inflateMenu(R.menu.my_menu)
toolbar.setOnMenuItemClickListener {
    onOptionsItemSelected(it)
}

독립형 툴바

제안 된 솔루션의 대부분은 상위 활동에 레이아웃에 툴바가 있고 를 통해 선언 한 setHasOptionsMenu(true)경우에만 작동 합니다 . 그러면 Fragments는이 정확한 ActionBar 의 메뉴 인구에 참여할 수 있습니다 .setSupportActionBar()

Fragment.onCreateOptionsMenu () : Fragment 호스트의 표준 옵션 메뉴의 내용을 초기화합니다.

하나의 특정 조각에 대한 독립형 도구 모음 및 메뉴를 원하는 경우 다음을 수행 할 수 있습니다.

menu_custom_fragment.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/menu_save"
        android:title="SAVE" />
</menu>

custom_fragment.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    ...

CustomFragment.kt

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val view = inflater.inflate(layout.custom_fragment, container, false)
    val toolbar = view.findViewById<Toolbar>(R.id.toolbar)
    toolbar.inflateMenu(R.menu.menu_custom_fragment)
    toolbar.setOnMenuItemClickListener {
        onOptionsItemSelected(it)
    }
    return view
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    return when (item.itemId) {
        R.id.menu_save -> {
            // TODO: User clicked the save button
            true
        }
        else -> super.onOptionsItemSelected(item)
    }
}

예, 그렇게 쉽습니다. onCreate()또는 을 재정의 할 필요도 없습니다 onCreateOptionsMenu().

추신 : 이것은와 만 작동 android.support.v4.app.Fragment하고 있습니다 android.support.v7.widget.Toolbar( AppCompatActivityAppCompat테마도 사용 하십시오 styles.xml).


답변

에서 menu.xml모든 메뉴 항목을 추가해야합니다. 그런 다음 초기 로딩에서 원하지 않는 항목을 숨길 수 있습니다.

menu.xml

<item
    android:id="@+id/action_newItem"
    android:icon="@drawable/action_newItem"
    android:showAsAction="never"
    android:visible="false"
    android:title="@string/action_newItem"/>

setHasOptionsMenu(true)onCreate () 메소드에 추가 하여 Fragment 클래스의 메뉴 항목을 호출하십시오.

FragmentClass.java

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

onCreateOptionsMenuFragment 클래스에서 다시 재정 의 할 필요가 없습니다 . onPrepareOptionsMenuFragment에서 사용 가능한 방법 을 재정 의하여 메뉴 항목을 변경 (추가 / 제거) 할 수 있습니다 .

@Override
public void onPrepareOptionsMenu(Menu menu) {
    menu.findItem(R.id.action_newItem).setVisible(true);
    super.onPrepareOptionsMenu(menu);

}


답변

메뉴를 부풀리기 전에 menu.clear ()를 사용해야합니다.

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

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }