9

我有一个DialogFragment使用setStyle(STYLE_NORMAL, R.style.Theme_App).

显示DialogFragment正常,但向上操作(homeAsUpActionBar 上的操作)不起作用。我尝试在中实现onOptionsItemSelectedDialogFragment但它从未被调用。

有没有办法在 DialogFragment 中获取 up 操作回调,以便我可以将其关闭?作为参考,我正在使用ActionBarCompat.

4

7 回答 7

21

这是不可能的,但有一个使用Toolbar. 现在您可以将其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();
            }
        });
    }
}
于 2015-10-12T11:54:03.160 回答
14

即使您可以设置主题,也无法将其附加ActionBar到它,它不会注册为它,将始终返回 null。DialogFragmentDialogFragmentActionBarDialog.getActionBar()

ActionBar您可以始终附加一个看起来像 ActionBar 的布局,并使用菜单在其上设置功能,而不是获取。

另一种方法是使用actionBar作为Dialog创建一个activity,你可以参考这篇文章

于 2014-06-13T02:06:50.133 回答
2

为了让 DialogFragment 接收对onOptionsItemSelected(MenuItem item)您的调用,需要setHasOptionsMenu(true);在 Fragment 的 onCreate() 方法中设置。

另一个可能的解决方案是在活动onOptionsItemSelected(MenuItem item)回调中处理 up 动作。像这样的东西:

@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;
    }
}
于 2014-06-12T23:01:44.097 回答
2

只需将接收它的组件(即父 Activity 或 Fragment)的 up 操作委托给您的 DialigFragment。当 up 发生时,检查您的 DialogFragment 是否显示,如果是,请调用适当的方法。

于 2014-06-14T07:52:01.493 回答
2

这里查看详细说明。

我通过添加以下编码解决了这些问题。

@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.

于 2014-06-14T09:49:27.170 回答
1

以下代码对我有用:

@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);
        }

希望这可以帮助 :)

于 2014-06-13T07:42:05.840 回答
1

在布局中定义工具栏并在对话框片段上调用它

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();
                              }
                          });
于 2017-11-14T09:39:09.803 回答