2016-08-16 59 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)。由於某種原因,這會引發空對象引用。 –