我有DialogFragment
使用setStyle(STYLE_NORMAL, R.style.Theme_App)
设置为全屏幕。
DialogFragment
显示正常但向上操作(ActionBar上的homeAsUp
操作)不起作用。我尝试在onOptionsItemSelected
中实施DialogFragment
,但它永远不会被调用。
有没有办法在DialogFragment中获取up动作回调,所以我可以解雇它?作为参考,我正在使用ActionBarCompat
。
答案 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
附加到ActionBar
, Dialog.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();
}
});