我有什麼是我的插入片段遊戲進入片段容器中的MainActivity:Dialog Fragment問題:onCreateDialog未被調用;不能回來按鍵
遊戲片斷創建了一個對話片段:
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.DialogInterface;
import android.net.Uri;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
public class Game extends Fragment {
static final int NUM_ITEMS = 2;
private OnFragmentInteractionListener mListener;
public Game() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_game, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
TextView tv = (TextView) getActivity().findViewById(R.id.toolbar_title);
tv.setText("Games");
Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar_game);
((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
final ViewPager viewPager = (ViewPager) getActivity().findViewById(R.id.viewpager_game);
setupViewPager(viewPager);
TabLayout tabLayout = (TabLayout) getActivity().findViewById(R.id.tablayout_game);
tabLayout.setupWithViewPager(viewPager);
FloatingActionButton fab = (FloatingActionButton) getActivity().findViewById(R.id.fab_game);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showDialog();
}
});
}
private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager());
adapter.addFrag(new gameTab(), "My Team");
adapter.addFrag(new scoutTab(), "Scout");
viewPager.setAdapter(adapter);
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
public void showDialog() {
android.support.v4.app.FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
//android.support.v4.app.CustomDialogFragment newFragment = new getActivity().CustomDialogFragment();
// The device is smaller, so show the fragment fullscreen
FragmentTransaction transaction = fragmentManager.beginTransaction();
// For a little polish, specify a transition animation
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
// To make it fullscreen, use the 'content' root view as the container
// for the fragment, which is always the root view for the activity
transaction.add(android.R.id.content, new NewGame())
.addToBackStack(null).commit();
}
public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
void onFragmentInteraction(Uri uri);
}
class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFrag(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
public static class gameTab extends Fragment {
int color;
//SimpleRecyclerAdapter adapter;
public gameTab() {
}
@SuppressLint("ValidFragment")
public gameTab (int color) {
this.color = color;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_game_tab, container, false);
final FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.frame_game_tab);
frameLayout.setBackgroundColor(color);
/*RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.game_tab_scrollableview);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity().getBaseContext());
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.setHasFixedSize(true);
List<String> list = new ArrayList<String>();
for (int i = 0; i < VersionModel.data.length; i++) {
list.add(VersionModel.data[i]);
}
adapter = new SimpleRecyclerAdapter(list);
recyclerView.setAdapter(adapter);*/
return view;
}
}
/* public static class gameTab extends Fragment {
private OnFragmentInteractionListener mListener;
public gameTab() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_game_tab, container, false);
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
void onFragmentInteraction(Uri uri);
}
}*/
public static class scoutTab extends Fragment {
private OnFragmentInteractionListener mListener;
public scoutTab() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_scout_tab, container, false);
}
/*@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
}*/
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
void onFragmentInteraction(Uri uri);
}
}
}
在這個對話片段我想攔截onBackPressed()以在按下後退鍵時顯示彈出窗口。我花了差不多2天的時間,而且我已經嘗試了很多來自堆棧溢出的好人的不同建議,但無濟於事。 here提供的看似最好的解決方案之一不適用於我,因爲我的onCreatDialog方法從未被調用過。
下面是對話的片段代碼(你可以看到我在測試看實際上被調用哪個方法):
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Toast;
public class NewGame extends DialogFragment {
EditText entryAway, entryHome;
private OnFragmentInteractionListener mListener;
private OnFragmentInteractionListener mListener2;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
FloatingActionButton fab = (FloatingActionButton) getActivity().findViewById(R.id.fab_game);
fab.setVisibility(View.GONE);
entryAway = (EditText) getActivity().findViewById(R.id.entry_away);
setHasOptionsMenu(true);
View rootView = inflater.inflate(R.layout.fragment_new_game, container, false);
Toolbar toolbar = (Toolbar) rootView.findViewById(R.id.toolbar_newg);
toolbar.setTitle("");
((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
actionBar.setHomeAsUpIndicator(R.drawable.ic_close);
}
return rootView;
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Log.d("Diag Frag", "This is the diag frag");
Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
return dialog;
}
@Override
public void onCancel (DialogInterface dialogInterface){
super.onCancel(dialogInterface);
Log.d("Diag Frag", "This is called");
}
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
Log.d("Diag Frag", "This is called");
dialog.cancel();
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.clear();
getActivity().getMenuInflater().inflate(R.menu.menu_ak, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//TODO: Add 2 different dialgoues. One if the it is has been edited and one if it hasn't.
int id = item.getItemId();
if (id == R.id.action_save) {
// handle confirmation button click here
LinearLayout nGF = (LinearLayout) getActivity().findViewById(R.id.newGameFields);
return true;
} else if (id == android.R.id.home) {
// handle close button click here
if(mListener.isEdited(R.id.newGameFields)){
//confirmPopup();
}else{
dismiss();
}
return true;
}
return super.onOptionsItemSelected(item);
}
public void confirmPopup() {
final DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case DialogInterface.BUTTON_POSITIVE:
//Erase button clicked
dismiss();
break;
case DialogInterface.BUTTON_NEGATIVE:
//Cancel button clicked
break;
}
}
};
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage("Discard new game?")
.setPositiveButton("ERASE", dialogClickListener)
.setNegativeButton("CANCEL", dialogClickListener).show();
}
/*
public boolean isEdited(){
LinearLayout nGF = (LinearLayout) getActivity().findViewById(R.id.newGameFields);
for (int i = 0; i <= nGF.getChildCount(); i++){
View v = nGF.getChildAt(i);
if(v instanceof EditText){
EditText ET = (EditText) getActivity().findViewById(nGF.getChildAt(i).getId()) ;
if (ET.getText().length() != 0){
Toast.makeText(getActivity(), "Empty!" + ET.getText().toString(),
Toast.LENGTH_SHORT).show();
return true;
}
}
}
return false;
}
*/
/*@Override
public boolean onBackPressed() {
return true;
}
*/
/* @Override
public void onBackPressedCallback() {
//this method is called by the DetailActivity,
//when its onBackPressed() method is triggered
Log.d("DetailActivity", "user pressed the back button");
}*/
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
FloatingActionButton fab = (FloatingActionButton) getActivity().findViewById(R.id.fab_game);
fab.setVisibility(View.VISIBLE);
}
public interface OnFragmentInteractionListener {
boolean isEdited(int Id);
//void onBackPressed();
void onFragmentInteraction(Uri uri);
}
}
任何幫助,非常感謝!如果您需要更多信息,請與我們聯繫。
編輯
好了,我終於通過這一切來分類的。當看着對話框上的Android文檔和下顯示一個對話框,全屏或嵌入式片段據說使用這個代碼:
public void showDialog() {
FragmentManager fragmentManager = getSupportFragmentManager();
CustomDialogFragment newFragment = new CustomDialogFragment();
if (mIsLargeLayout) {
// The device is using a large layout, so show the fragment as a dialog
newFragment.show(fragmentManager, "dialog");
} else {
// The device is smaller, so show the fragment fullscreen
FragmentTransaction transaction = fragmentManager.beginTransaction();
// For a little polish, specify a transition animation
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
// To make it fullscreen, use the 'content' root view as the container
// for the fragment, which is always the root view for the activity
transaction.add(android.R.id.content, newFragment)
.addToBackStack(null).commit();
}
}
我誤會了是怎麼回事。此:
newFragment.show(fragmentManager, "dialog");
將DialogFragment顯示爲對話框。它調用所有的Dialog方法,比如onCreateDialog。但是這個:
// The device is smaller, so show the fragment fullscreen
FragmentTransaction transaction = fragmentManager.beginTransaction();
// For a little polish, specify a transition animation
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
// To make it fullscreen, use the 'content' root view as the container
// for the fragment, which is always the root view for the activity
transaction.add(android.R.id.content, newFragment)
.addToBackStack(null).commit();
將DialogFragment顯示爲片段。因此,它不會調用Dialog方法,而是調用Fragment方法。
我最終只是把我的DialogFragment變成了一個片段。
你能詳細說明你的意思嗎?我沒有跟着...... –
我的意思是你沒有按照正確的方式來顯示對話框片段,使用showDialog()方法來顯示對話框片段。 –
哦,我明白了。我只是在做它在這裏說的方式:https://developer.android.com/guide/topics/ui/dialogs.html 但是,這將如何影響我上面描述的問題? –