2017-02-02 44 views
2

我想处理newgame按钮并在我的主要活动中添加播放器按钮。正如你所看到的,我在我的warningdialog类中定义了视图(它扩展了DialogFragment,我尝试了一个getter并尝试调用它,但是我得到了nullpointer异常,我尝试了其他方法,但应用程序崩溃了。这样做的最好方法是什么?我想这样做的原因是因为我在按下按钮时想要调用主要活动中的其他方法,所以我认为从主要活动处理对话框按钮是最佳选择。在主要活动中处理来自dialogfragment的按钮

这里是我的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调用回活动中的公共方法即可。

在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一起使用,则可以定义一个接口回调,并使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 
     }   
    } 
} 

您也可以使用上onActivityResult的意图参数传递附加数据。

+0

我疯了e onActivityResult公共,但我得到“onActivityResult(int,int,android.content.intent)已保护访问android.support.v4.app.FragmentActivity”错误消息 –

+0

Woops,上面的模式用于沟通一个DialogFragment和一个片段。对困惑感到抱歉。 –

相关问题