Действие ActionBar на DialogFragment

У меня есть DialogFragment, оформленный в полноэкранном режиме с помощью setStyle(STYLE_NORMAL, R.style.Theme_App).

DialogFragment показывает нормально, но действие вверх (действие homeAsUp на панели действий) не работает. Я пытался реализовать onOptionsItemSelected в DialogFragment, но он никогда не вызывается.

Есть ли способ получить обратный вызов действия в DialogFragment, чтобы я мог его отклонить? Для справки, я использую ActionBarCompat.


person Saad Farooq    schedule 10.06.2014    source источник
comment
что такое действие вверх?   -  person Rod_Algonquin    schedule 10.06.2014
comment
Вы показываете панель действий в диалоговом окне?   -  person Weibo    schedule 10.06.2014
comment
Конечно. Он показывает ActionBar, когда я устанавливаю этот стиль. Стиль тот же, что и для моей деятельности.   -  person Saad Farooq    schedule 10.06.2014
comment
вы ищете этот вид диалога ?? stackoverflow.com/questions/11425020/   -  person MilapTank    schedule 19.06.2014
comment
@Saad Farooq попробуйте это решение. это обходной путь, но он может решить вашу проблему.   -  person Sheraz Ahmad Khilji    schedule 12.10.2015


Ответы (7)


Невозможно прикрепить ActionBar к DialogFragment, даже если вы можете установить тему DialogFragment, она не будет зарегистрирована как ActionBar, Dialog.getActionBar() всегда будет возвращать значение null.

Вместо получения ActionBar вы всегда можете прикрепить макет, который будет выглядеть как панель действий, и установить на нем функциональность с помощью меню.

Другой способ — создать действие с actionBar в качестве диалога, на который вы можете ссылаться в этом сообщении.

person Rod_Algonquin    schedule 13.06.2014
comment
К сожалению, это кажется правильным ответом в настоящее время - person Saad Farooq; 20.06.2014
comment
Вместо этого есть способ прикрепить панель инструментов, которая работает примерно так же, как панель действий. Здесь: stackoverflow.com/a/38917527/878126 - person android developer; 12.08.2016
comment
самые последние функции добавляются в версию панели инструментов библиотеки поддержки, и они доступны на любом устройстве, которое может использовать библиотеку поддержки. По этой причине вам следует использовать класс Toolbar библиотеки поддержки для реализации панелей приложений ваших действий. developer.android.com/training/appbar/setting-up - person samis; 14.03.2019

Это было невозможно, но для этого есть обходной путь с помощью aToolbar. Теперь вы можете включить Toolbar как часть вашего DialogFragment layout xml и настроить его дизайн/значок в соответствии с вашими потребностями. Вам также потребуется реализовать setNavigationOnClickListener, если вы хотите, чтобы кнопка «Назад» работала как обычно. См. пример класса ниже.

package com.package.name;

import android.app.Dialog;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;



public class MyDialogFragment extends DialogFragment {
    private View parentView;
    private Toolbar toolbar;


    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        setStyle(DialogFragment.STYLE_NO_FRAME, R.style.Theme_AppCompat_NoActionBar);
        return super.onCreateDialog(savedInstanceState);
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        //The layout xml file contains the toolbar
        parentView = inflater.inflate(R.layout.dialogfragment_createpost, container, false);
        initView();
        initData();
        return parentView;
    }


    private void initView() {
        toolbar = (Toolbar) parentView.findViewById(R.id.toolbar);

    }

    private void initData() {
        toolbar.setTitle("Post");
        //Set naviagtion icon to back button drawable
        toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
// handle back button naviagtion
                dismiss();
            }
        });
    }
}
person Sheraz Ahmad Khilji    schedule 12.10.2015

Чтобы DialogFragment мог получать вызовы onOptionsItemSelected(MenuItem item), вам нужно установить setHasOptionsMenu(true); в методе onCreate() Фрагмента.

Другим потенциальным решением является обработка действия up в обратном вызове onOptionsItemSelected(MenuItem item) действий. Что-то вроде этого:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        // Respond to the action bar's Up/Home button
        onBackPressed();
        return true;
    }
}
person Larry McKenzie    schedule 12.06.2014

Просто делегируйте действие up от компонента, который его получает (т.е. родительского Activity или Fragment), вашему DialigFragment. Когда происходит up, проверьте, отображается ли ваш DialogFragment, и если да, вызовите соответствующий метод.

person einschnaehkeee    schedule 14.06.2014

Подробное описание см. здесь.

Я решил эту проблему, добавив приведенную ниже кодировку.

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

    return super.onOptionsItemSelected(item);
}

В MainActivity:

Ранее,

открытый класс MainActivity расширяет BaseActivity

Затем я превращаюсь в

открытый класс MainActivity расширяет FragmentActivity

Скорее всего, вам нужно расширить MainActivity to FragmentActivity.

person Steve    schedule 14.06.2014
comment
Ждать ?? Вы получаете этот обратный вызов в DialogFragment ?? - person Saad Farooq; 15.06.2014
comment
@SaadFarooq yes В DialogFragment вы должны использовать намерение, чтобы передать его этому действию для кнопки навигации на панели действий. - person Steve; 16.06.2014
comment
Не пойдет... А где умысел? - person Saad Farooq; 17.06.2014
comment
@SaadFarooq, во-первых, вам нужно пройти по этой ссылке. Прочитайте вопросы и ответы, опубликованные мной. http://stackoverflow.com/questions/24032956/action-bar-back-button-not-working.Затем проверьте ответ.В GalleryFragment вы видите Intent.Например: вы должны использовать intent в коде Fragment, а затем передать его в код Activity.В коде Activity вы должны установить homeAsUp action button.Затем в Manifest вы должны установить эти Activity Name. Вот и все. - person Steve; 17.06.2014
comment
@SaadFarooq Просто используйте подобное намерение. Intent intent = new Intent(getActivity(), YourActivity.class); startActivity(intent); в методе onClick или onItemClick в коде фрагмента. - person Steve; 17.06.2014

У меня работал следующий код:

@Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
            // Respond to the action bar's Up/Home button
            case android.R.id.home:
                NavUtils.navigateUpFromSameTask(this);
                return true;
            }
            return super.onOptionsItemSelected(item);
        }

Надеюсь это поможет :)

person Michele La Ferla    schedule 13.06.2014
comment
Нет... никогда не звонили. И аргумент navigateUpFromSameTask не может быть DialogFragment. - person Saad Farooq; 13.06.2014

определить панель инструментов в макете и вызвать ее в фрагменте диалога

Toolbar toolbar=dialog.findViewById(R.id.toolbar);
                           toolbar.setNavigationIcon(R.drawable.ic_arrow_back_black_24dp);
                          toolbar.setOnClickListener(new View.OnClickListener() {
                              @Override
                              public void onClick(View view) {
                                  dialog.dismiss();
                              }
                          });
person roshan posakya    schedule 14.11.2017