请您帮忙解决以下问题:
我正在尝试从alertdialog deletePlayer
调用片段PlayersActivityFragment
中的方法NameAlertDialogFragment
。
代码如下:
public static class PlayersActivityFragment extends Fragment {
ArrayList<Player> arrayPlayers;
ListView listViewPlayers;
//PlayerAdapter adapter;
public PlayersActivityFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
arrayPlayers = new ArrayList<Player>();
View rootView = inflater.inflate(R.layout.fragment_activity_players, container, false);
Button buttonAddPlayer = (Button) rootView.findViewById(R.id.button_addplayers);
buttonAddPlayer.setOnClickListener(new View.OnClickListener(){
public void onClick(View view) {
arrayPlayers.add(new Player("Player", 0));
Player selectedPlayer = arrayPlayers.get(arrayPlayers.size()-1);
((PlayersActivity)getActivity()).showNameDialogFragment(selectedPlayer);
}
});
listViewPlayers = (ListView) rootView.findViewById(R.id.listView_playername);
return rootView;
}
public void deletePlayer(){
arrayPlayers.remove(arrayPlayers.size()-1);
}
}
void showNameDialogFragment(Player player) {
mDialog = NameAlertDialogFragment.newInstance(player);
mDialog.show(getFragmentManager(),"SCORE DIALOG");
}
// Class that creates the AlertDialog
public static class NameAlertDialogFragment extends DialogFragment {
static Player selectedPlayer;
public static NameAlertDialogFragment newInstance(Player player) {
selectedPlayer = player;
return new NameAlertDialogFragment();
}
// Build AlertDialog using AlertDialog.Builder
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Get the layout inflater
LayoutInflater inflater = getActivity().getLayoutInflater();
final View view = inflater.inflate(R.layout.alertdialog_name, null);
final EditText editTextName = (EditText) view.findViewById(R.id.edittext_name);
return new AlertDialog.Builder(getActivity())
// Inflate and set the layout for the dialog
// Pass null as the parent view because its going in the dialog layout
.setView(view)
.setMessage("Enter Player's Name:")
//Set up Yes Button
.setPositiveButton("Done", new DialogInterface.OnClickListener() {
public void onClick(final DialogInterface dialog, int id) {
mName = editTextName.getText().toString().trim();
selectedPlayer.setName(mName);
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//PlayersActivityFragment playersActivityFragment = (PlayersActivityFragment) getFragmentManager().findFragmentById(R.id.container);
//playersActivityFragment.deletePlayer();
//((PlayersActivityFragment)getTargetFragment()).deletePlayer();
NameAlertDialogFragment.this.getDialog().cancel();
}
})
.create();
}
}
我试图调用这些方法的两种不同方式在.setNegativeButton
onClickListener中被注释掉了:
PlayersActivityFragment playersActivityFragment = (PlayersActivityFragment) getFragmentManager().findFragmentById(R.id.container);
playersActivityFragment.deletePlayer();
和
((PlayersActivityFragment)getTargetFragment()).deletePlayer();
谢谢!
答案 0 :(得分:0)
首先,为什么你的所有类都是静态的?无论如何,这是一个应该有效的答案......
尝试使用接口作为回调。例如:
首先创建一个界面。
public interface NameAlertDialogListener {
public void onNegativeClick();
}
然后让PlayersFragment实现NameAlertDialogListener。
public static class PlayersActivityFragment extends Fragment implements NameAlertDialogListener
接下来,在PlayersFragment中,创建一个名为onNegativeClick的方法。
@Override
public void onNegativeClick() {
//delete or whatever you want to do.
}
为侦听器创建成员变量:
static Player selectedPlayer;
static NameAlertDialogListener mCallBack;
接下来,在对话框片段中创建一个名为setListener的方法。
public void setListener(NameAlertDialogListener callback) {
try {
mCallBack = callback;
} catch (ClassCastException e){
throw new ClassCastException(callback.toString() + " must implement NameAlertDialogListener" );
}
}
然后,在创建对话框片段时调用setListener方法。
void showNameDialogFragment(Player player) {
mDialog = NameAlertDialogFragment.newInstance(player);
mDialog.setListener(this);
mDialog.show(getFragmentManager(),"SCORE DIALOG");
}
最后,在您的负面点击监听器中:
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
mCallBack.onNegativeClick() ;
NameAlertDialogFragment.this.getDialog().cancel();
}
})
答案 1 :(得分:0)
我不确定这是否是正确的做事方式,但我已经找到了可行的解决方案。
首先,我将ArrayList<Player> arrayPlayers;
移到PlayersActivityFragment
片段之外。
然后我移动了方法:
public void deletePlayer(){
arrayPlayers.remove(arrayPlayers.size()-1);
}
在PlayersActivityFragment
片段之外。
然后,我使用行deletePlayer()
调用alertdialog中的((PlayersActivity)getActivity()).deletePlayer();
方法。
答案 2 :(得分:0)
实际上,我有点黑客,它不是很好,但它很容易实现:在PlayersActivityFragment
中声明DialogFragment
变量。然后将构造函数更改为:
public static NameAlertDialogFragment newInstance(Player player,PlayersActivityFragment fragment ){
selectedPlayer = player;
NameAlertDialogFragment test = new NameAlertDialogFragment();
test.playerActivityFragment = fragment;
return test;
}
然后,您可以在playerActivityFragment.deletePlayer()
的任何地方致电DialogFragment
。
P / s:最好的方法是实现interface
,但对于像我这样的懒惰编码器,上面的方法更好lol!