处理主活动中dialogfragment的按钮

时间:2017-02-02 22:59:41

标签: java android android-dialogfragment

我想处理newgame按钮并在我的主要活动中添加玩家按钮。你可以看到我在我的warningdialog类中定义了视图(它扩展了DialogFragment,我尝试了一个getter并尝试调用但是我得到了nullpointer异常,我尝试了其他方法,但应用程序崩溃了。

这样做最好的方法是什么?我想这样做的原因是因为我在按下按钮时想要调用主活动中的其他方法,所以我认为处理主活动中的对话框按钮是最佳选择。

这是我的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 个答案:

答案 0 :(得分:2)

您需要做的就是将DialogFragment调用回Activity中的公共方法。

在DialogFragment中,为新游戏按钮添加一个新的OnClickListener:

curve(dnorm(x),-3,3,bty="n")
axis(side=4,at = c(0,.1, .2, .3,.4),labels = c("Trivial", "Anecdotal", "Substantial","Strong", " "),las=1)

然后将其设置为新游戏按钮的点击监听器:

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

然后,在Activity中,只需定义将在单击DialogFragment按钮时调用的公共方法:

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

答案 1 :(得分:1)

您可以从DialogFragment中调用Activity.onActivityResult,然后根据请求&响应代码响应恰当。我不认为你的方法可以工作,因为按钮需要在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
        }        
    }
}

您还可以使用onActivityResult上的Intent参数传递其他数据。