从AlertDialog调用片段中的方法

时间:2015-08-26 05:04:48

标签: android android-fragments android-alertdialog

请您帮忙解决以下问题:

我正在尝试从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();

谢谢!

3 个答案:

答案 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!