对DialogFragment执行ActionBar操作

时间:2014-06-10 06:55:43

标签: android android-dialogfragment android-actionbar-compat dialogfragment

我有DialogFragment使用setStyle(STYLE_NORMAL, R.style.Theme_App)设置为全屏幕。

DialogFragment显示正常但向上操作(ActionBar上的homeAsUp操作)不起作用。我尝试在onOptionsItemSelected中实施DialogFragment,但它永远不会被调用。

有没有办法在DialogFragment中获取up动作回调,所以我可以解雇它?作为参考,我正在使用ActionBarCompat

7 个答案:

答案 0 :(得分:17)

这是不可能的,但有一个使用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();
            }
        });
    }
}

答案 1 :(得分:12)

即使您可以将ActionBar的主题设置为DialogFragment,也无法将DialogFragment附加到ActionBarDialog.getActionBar()将始终返回null。

您可以随时附加一个看似ActionBar的布局,并使用菜单设置其功能,而不是获取ActionBar

另一种方法是使用actionBar创建一个活动作为对话框,你可以参考这个post

答案 2 :(得分:2)

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

答案 3 :(得分:2)

查看here以获取详细说明。

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

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

答案 4 :(得分:1)

为了让DialogFragment接收到onOptionsItemSelected(MenuItem item)的来电,您需要在片段的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;
    }
}

答案 5 :(得分: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);
        }

希望这会有所帮助:)

答案 6 :(得分:0)

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

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