2017-02-02 3 views
2

Я хочу обработать кнопку новой игры и добавить кнопку игроков в свой основной вид деятельности. Как вы можете видеть, я определяю представление в своем классе warningdialog (который расширяет DialogFragment, я пытался использовать getter и пытался называть это, но я получаю исключение nullpointer, я также пробовал другие методы, но приложение разбилось.Работа с кнопками из диалогового окна в основном действии

Whats лучший способ сделать это? Причина, по которой я хочу это сделать, заключается в том, что у меня есть другие методы в основной деятельности, которые я хочу вызвать, когда нажимается кнопка, поэтому я считаю, что обращение к диалоговому окну из основной активности - лучший выбор.

Вот мой Warningdialog, который простирается от dialogfragment

public class WarningDialog extends DialogFragment { 

public Button mNewGame, mAddPlayersBtn; 
private ImageButton mCloseBtn; 


/** 
* Method to close the dialog 
*/ 
private View.OnClickListener mBtnListener = new View.OnClickListener(){ 
    @Override 
     public void onClick(View v){ 
      dismiss(); 
    } 
}; 

public WarningDialog() { 

} 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setStyle(DialogFragment.STYLE_NORMAL, R.style.DialogTheme); 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.newgame_dialog,container,false); 
} 

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    mAddPlayersBtn = (Button) view.findViewById(R.id.btnAddPlayers); 
    mNewGame = (Button) view.findViewById(R.id.btnNewGame); 
    mCloseBtn = (ImageButton) view.findViewById(R.id.btnClose); 

    //closing the dialog 
    mCloseBtn.setOnClickListener(mBtnListener); 

} 


public Button getmNewGame() { 
    return mNewGame; 
} 

Основной метод деятельности:

private void warningDialog(){ 
    final WarningDialog warningDialog = new WarningDialog(); 
    warningDialog.show(getSupportFragmentManager(),"Warning"); 

    warningDialog.getmNewGame().setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 
     } 
    }); 

} 

ответ

2

Все, что вам нужно сделать, это вернуть вызов DialogFragment в открытый метод в Activity.

В DialogFragment добавить новый OnClickListener для новой кнопки игры:

/** 
* Method to start new game 
*/ 
private View.OnClickListener mNewGameBtnListener = new View.OnClickListener(){ 
    @Override 
     public void onClick(View v){ 
      ((MainActivity)getActivity()).doNewGame(); 
      dismiss(); 
    } 
}; 

Затем установите его в качестве мыши слушателя для новой кнопки игры:

mNewGame = (Button) view.findViewById(R.id.btnNewGame); 
mNewGame.setOnClickListener(mNewGameBtnListener); 

Затем в деятельности , просто определите общедоступный метод, который будет вызываться при нажатии кнопки DialogFragment:

public void doNewGame() { 
    //User chose new game! 
} 
+0

Спасибо. Он работал, но не уверен, что это лучшая практика? когда думаешь об инкапсуляции. –

+0

Если вы хотите удалить плотную муфту так, чтобы этот DialogFragment можно было использовать с несколькими действиями, вы можете определить обратный вызов интерфейса и сделать Activity реализацией интерфейса. –

1

Вы можете позвонить Activity.onActivityResult из DialogFragment, а затем на основе кодов ответа просьба & реагировать соответствующим образом. Я не думаю, что ваш подход может работать, потому что кнопки должны быть инициализированы в onCreateView и т. Д., О которых ваша деятельность не будет знать.

public class WarningDialog extends DialogFragment { 
    public static int RC_WARNING = 100; 
    public static int RC_NEW_GAME = 101; 
    public static int RC_ADD_PLAYER = 102; 

    /** 
    * Method to handle clicks in the dialog 
    */ 
    private View.OnClickListener mBtnListener = new View.OnClickListener(){ 
     @Override 
     public void onClick(View v){ 
      if (v == mCloseBtn) { 
       dismiss(); 
      } else if (v == mNewGame) { 
       getActivity().onActivityResult(RC_WARNING, RC_NEW_GAME, null); 
      } else if (v == mAddPlayersBtn) { 
       getActivity().onActivityResult(RC_WARNING, RC_ADD_PLAYER, null); 
      } 
     } 
    }; 
} 

// In your activity: 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (request_code == WarningDialog.RC_WARNING) { 
     if (resultCode == WarningDialog.RC_NEW_GAME) { 
      // new game logic 
     } else if (resultCode == WarningDialog.RC_ADD_PLAYER) { 
      // add player logic 
     }   
    } 
} 

Вы также можете передать дополнительные данные с помощью Intent параметра на onActivityResult.

+0

Я с ума сошел e onActivityResult public, но я получаю «onActivityResult (int, int, android.content.intent) имеет защищенный доступ в android.support.v4.app.FragmentActivity» сообщение об ошибке –

+0

Woops, вышеприведенный шаблон используется для связи между Диалоговый фрагмент и фрагмент. Извините за путаницу. –