在DialogFragment上提升操作栏ActionBar的操作

9
我有一个 DialogFragment,使用 setStyle(STYLE_NORMAL, R.style.Theme_App) 进行全屏样式设置。 DialogFragment 可以正常显示,但是 ActionBar 上的返回操作(homeAsUp 操作)无法使用。我尝试在 DialogFragment 中实现 onOptionsItemSelected 方法,但它从未被调用。
是否有办法在 DialogFragment 中获取返回操作的回调,以便我可以关闭它?供参考,我正在使用 ActionBarCompat

什么是 up 操作? - Rod_Algonquin
你在对话框上显示操作栏吗? - Weibo
确实。当我设置那个样式时,它会显示ActionBar。这个样式对我的所有活动都是一样的。 - Saad Farooq
你是否在寻找这种对话框??https://dev59.com/7Wgu5IYBdhLWcg3wTVU6 - MilapTank
@Saad Farooq 请尝试使用这个解决方案。虽然这只是一个变通方法,但它可能会解决你的问题。 - Sheraz Ahmad Khilji
7个回答

21

虽然直接实现不可能,但可以使用Toolbar进行变通。 现在您可以将Toolbar作为DialogFragment布局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();
            }
        });
    }
}

14

尽管您可以设置 DialogFragment 的主题,但无法将 ActionBar 附加到其上,即使这样做也不会将其注册为 ActionBar, Dialog.getActionBar() 始终返回 null。

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

另一种方法是创建一个带有 ActionBar 的活动作为对话框,您可以参考此post


2
不幸的是,目前看来这似乎是正确的答案。 - Saad Farooq
有一种方法,可以附加工具栏,其工作方式与操作栏大致相同。在这里:https://dev59.com/7Wgu5IYBdhLWcg3wTVU6#38917527 - android developer
最近的功能已经添加到支持库版本的工具栏中,并且可以在任何可以使用支持库的设备上使用。因此,您应该使用支持库的工具栏类来实现您的活动应用栏。 - samus

2
只需将“up”操作从接收它的组件(即父活动或片段)委托给您的DialogFragment。当出现“up”时,请检查您的DialogFragment是否显示,如果是,则调用相应的方法。

2
为了让DialogFragment接收到onOptionsItemSelected(MenuItem item)的调用,你需要在Fragment的onCreate()方法中设置setHasOptionsMenu(true);
另一个可能的解决方案是在活动的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;
    }
}

2

详细描述请查看此处

我通过添加以下代码来解决这些问题。

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

    return super.onOptionsItemSelected(item);
}

MainActivity中:
之前是这样的,

public class MainActivity extends BaseActivity

现在我改成了

public class MainActivity extends FragmentActivity

很可能你需要将一个MainActivity扩展为一个FragmentActivity

等等,你在 DialogFragment 中收到了那个回调吗? - Saad Farooq
@SaadFarooq 是的,在 DialogFragment 中,你需要使用 intent 将其传递给该活动以用于操作栏导航按钮。 - Stephen
没有结果...意图在哪里? - Saad Farooq
@SaadFarooq 首先,您需要查看这些链接。阅读我发布的问题和答案。https://dev59.com/xmAg5IYBdhLWcg3wDHQ3。然后查看答案。在 GalleryFragment 中,您会看到 Intent。例如:您必须在 Fragment 代码中使用 intent,然后将其传递给 Activity 代码。在 Activity 代码中,您必须设置 homeAsUp action button。然后在 Manifest 中,您必须设置这些 Activity Name。就是这样。 - Stephen
@SaadFarooq 只需像这样使用意图。在片段代码的 onClickonItemClick 方法中,Intent intent = new Intent(getActivity(), YourActivity.class); startActivity(intent); - Stephen

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

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

希望这有所帮助 :)


不... 它从未被调用。而且 navigateUpFromSameTask 的参数不能是 DialogFragment。 - Saad Farooq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接