2016-08-16 130 views
1

我有什么是我的插入片段游戏进入片段容器中的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变成了一个片段。

回答

0

如果你想打电话对话片段片段比不必须取代添加你的对话框里面的片段,请致电对话片段这样的,它的工作...

public void showDialog() { 
    NewGame newGame = new NewGame(); 
    newGame.show(getChildFragmentManager(), ""); 
} 
+0

你能详细说明你的意思吗?我没有跟着...... –

+0

我的意思是你没有按照正确的方式来显示对话框片段,使用showDialog()方法来显示对话框片段。 –

+0

哦,我明白了。我只是在做它在这里说的方式:https://developer.android.com/guide/topics/ui/dialogs.html 但是,这将如何影响我上面描述的问题? –

0

我看不到你在哪里显示你的NewGame对话框。 顺便提一下,片段不能拦截回来,但是您可以在MainActivity中覆盖onBackPressed()并将此事件委托给Game片段,该片段将决定要执行的操作。

+0

好吧,我确实尝试过。如果你看看MainActivity类的开头,你会看到:onBackPressed方法,我试图从NewGame片段调用confirmPopup方法(为了测试目的,我有3 == 3)。由于某种原因,这会引发空对象引用。 –