Меню опций в DialogFragment

У меня есть два фрагмента, один из которых - фрагмент списка, а другой - я использую его как диалоговое окно один раз, а как фрагмент - моя проблема здесь с меню параметров, во фрагменте списка есть меню элемента, которое показывает всегда действие, а во фрагменте диалога я не хочу этот элемент должен быть виден, и я не хочу, чтобы меню опций тоже было видно, я пытался

setHasOptionMenu(false)

но это не сработало, и я попытался setHasOptionMenu(true) очистить все элементы в меню, но это тоже не сработало.

Кроме того, в моей родительской деятельности нет кода для меню параметров. вот мой код:

@SuppressLint("InflateParams")
public class FormGeneratorActivity extends DialogFragment {
Control mControl;
boolean doChangeTitle;
private boolean isDialog;
public static int CreatedNum = 0;


public static FormGeneratorActivity getInstance(Control mControl, boolean doChangeTitle) {
    FormGeneratorActivity frag = new FormGeneratorActivity();
    Bundle b = new Bundle();
    b.putParcelable("control", mControl);
    b.putBoolean("changeTitle", doChangeTitle);
    frag.setArguments(b);
    return frag;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        doChangeTitle = getArguments().getBoolean("changeTitle");
    }
    setHasOptionsMenu(false);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    return super.onOptionsItemSelected(item);
}

@Override
public void onPrepareOptionsMenu(Menu menu) {
    menu.clear();
    activity.invalidateOptionsMenu();
    super.onPrepareOptionsMenu(menu);

}

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



public void setDoChangeTitle(boolean doChangeTitle) {
    this.doChangeTitle = doChangeTitle;
}

View view;
boolean isInflated = false;
ParentActivity activity;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (view == null) {
        mControl = getArguments().getParcelable("control");
        view = inflater.inflate(R.layout.form_generator_fragment, container, false);
        container = (LinearLayout) view.findViewById(R.id.cont);
        isInflated = true;
    } else {
        if (view.getParent() != null)
            ((ViewGroup) view.getParent()).removeAllViews();
        isInflated = false;
    }

    return view;
}

String headerPageTitle = null;

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    activity = (ParentActivity) getActivity();
    activity.getSupportActionBar().invalidateOptionsMenu();

        CreatedNum++;

}

@Override
public void onResume() {
    super.onResume();
    activity.setPageTitle(headerPageTitle);
    setHasOptionsMenu(false);
    activity.getSupportActionBar().invalidateOptionsMenu();

}


public void isDialog(boolean b) {
    isDialog = b;
}

}


person Hanaa Mohamed    schedule 14.07.2016    source источник
comment
Здесь требуется код   -  person Pankaj Kumar    schedule 14.07.2016
comment
я обнаружил, что мне нужно только время, чтобы фрагмент диалога знал, что меню параметров больше не существует, поэтому мне пришлось опубликовать задержку с помощью обработчика, прежде чем я начну фрагмент   -  person Hanaa Mohamed    schedule 14.07.2016


Ответы (4)


Меню параметров в DialogFragment(Fragment) с действием Search(SearchView):

MenuDialogFragment.class

public class MenuDialogFragment extends DialogFragment {

    Toolbar toolbar;

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

        View view = inflater.inflate(R.layout.custom_dialog_layout, container, false);

        toolbar = view.findViewById(R.id.custom_dialog_layout_toolbar);

        toolbar.inflateMenu(R.menu.menu_custom_dialog);

        Menu menu = toolbar.getMenu();
        SearchView searchView = (SearchView) menu.findItem(R.id.menu_searchview).getActionView();

        // DO whatever you need with menu items

        return view;
    }
}

menu_custom_dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    >
    <item
        android:id="@+id/menu_searchview"
        android:icon="@drawable/ic_search"
        android:title="Search"
        app:showAsAction="always|collapseActionView"
        app:actionViewClass="android.support.v7.widget.SearchView"
        />
</menu>

custom_dialog_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
>

<android.support.v7.widget.Toolbar
    android:id="@+id/custom_dialog_layout_toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    />
</LinearLayout>
person researcher    schedule 25.04.2019

вы можете попробовать установить родительский фрагмент, например: fragment.setTargetFragment(getSupportFragmentManager().findFragmentById(R.id.frame), 1);

и в дочернем фрагменте вы выполняете (в методах onAttach/onDetach) getTargetFragment().setMenuVisibility(true);

person user3593033    schedule 14.07.2016

Может быть, попробовать использовать одну из тем диалога, когда вы вызываете этот фрагмент как диалог. Для этого вы можете использовать этот конструктор:

AlertDialog.Builder (контекст контекста, тема int)

ie

Построитель AlertDialog.Builder = новый AlertDialog.Builder (getActivity(), тема)

Еще одно объяснение: Тема не применяется к DialogFragment на Android

person Kacper Wolkowski    schedule 14.07.2016

я обнаружил, что фрагменту диалога нужно только время, чтобы узнать, что меню параметров больше не существует, поэтому мне пришлось опубликовать задержку с помощью обработчика, прежде чем я начну фрагмент

person Hanaa Mohamed    schedule 16.07.2016
comment
Вы не должны использовать код с задержкой по времени таким образом, так как вы не можете предсказать, что он будет работать для каждого типа устройства. - person Chucky; 27.02.2017