在枚举内调用startActivity()等函数

时间:2014-08-15 07:30:02

标签: android enums android-dialogfragment

我想集中创建用于向用户报告错误的DialogFragments,以便只提供一个类,我将错误代码传递给该类,并自动生成对话框。

为了处理多个错误,我使用了一个枚举,我在其中定义了错误的属性。

public enum DialogError {

  TTS_NOT_INSTALLED {
    @Override
    public int getTitleResource() {
      return R.string.error_tts_not_installed_title;
    }
    @Override
    public int getMessageResource() {
      return R.string.error_tts_not_installed_message;
    }
    @Override
    public int getPositiveButtonResource() {
      return R.string.error_tts_not_installed_button_positive;
    }
    @Override
    public void onPositiveButtonClick() {
      // TODO
    }
    @Override
    public int getNegativeButtonResource() {
      return R.string.error_tts_not_installed_button_negative;
    }
    @Override
    public void onNegativeButtonClick() {
      // TODO
    }
  };

  public abstract int getTitleResource();
  public abstract int getMessageResource();
  public abstract int getPositiveButtonResource();
  public abstract void onPositiveButtonClick();
  public abstract int getNegativeButtonResource();
  public abstract void onNegativeButtonClick();

}

然后我调用了FragmentDialogError类来创建一个新的Dialog。

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;

public class FragmentDialogError
    extends DialogFragment {

  Context context;
  DialogError error;

  public FragmentDialogError(Context context, DialogError error) {
    this.context = context;
    this.error = error;
  }

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
  }

  @Override
  public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder
        .setTitle(error.getTitleResource())
        .setMessage(error.getMessageResource())
        .setPositiveButton(error.getPositiveButtonResource(),
            new DialogInterface.OnClickListener() {
          public void onClick(DialogInterface dialog, int id) {
            error.onPositiveButtonClick();
          }
        })
        .setNegativeButton(error.getNegativeButtonResource(),
            new DialogInterface.OnClickListener() {
          public void onClick(DialogInterface dialog, int id) {
            error.onNegativeButtonClick();
          }
        });
    return builder.create();
  }

}

我现在的问题是我无法在枚举的onPositiveButtonClick()或onNegativeButtonClick()中调用startActivity等函数。

一个解决方案是在FragmentDialogError中使用switch(),但这样我会在枚举和类之间拆分代码。另一个是以某种方式定义按钮按下可以触发的动作并让它们处理到另一个类,但我正在寻找一个干净而优雅的解决方案。

如何在Java中实现这一点,保持代码整洁?

1 个答案:

答案 0 :(得分:1)

为什么不直接向可以用来执行startActivity的onClick处理程序添加一个Context?

此外,为什么不使用成员和构造函数,而不是覆盖枚举中的所有方法?

public enum DialogError {

  TTS_NOT_INSTALLED(
    R.string.error_tts_not_installed_title,
    R.string.error_tts_not_installed_message,
    R.string.error_tts_not_installed_button_positive,
    R.string.error_tts_not_installed_button_negative) {

    public void onPositiveButtonClick(Context context) {
      context.startActivity...
    }

    @Override
    public void onNegativeButtonClick(Context context) {
      // TODO
    }
  };

  private final int mTitle;
  private final int mMessage;
  private final int mPositive;
  private final int mNegative;

  private DialogError(int title, int message, int positive, int negative) {
      mTitle = title;
      mMessage = message;
      mPositive = positive;
      mNegative = negative;
  }

  public final int getTitleResource() {
      return mTitle;
  }
  public final int getMessageResource() {
      return mMessage;
  }
  public final int getPositiveButtonResource() {
      return mPositive;
  }
  public final int getNegativeButtonResource() {
      return mNegative;
  }

  public abstract void onPositiveButtonClick();
  public abstract void onNegativeButtonClick();

}