についてこれらの状況には私がFormatter
と呼ぶ追加のヘルパークラスがあります。 Presenter
から現在の状態をView
に渡し、Formatter
にその状態に基づいて適切な文字列を尋ねます。小さな例が役立つと思います。
ビューに設定するデータを表すオブジェクトがあります。今のところState
それを呼ぶことにしましょう:
public class MessagePresenter {
private void setMessage() {
// logic here
State state = new State(true, "Hello from the server");
view().setMessage(state);
}
}
次に、あなたのアクティビティ/フラグメント/のViewGroupにあなたを:あなたは何が必要ロジックに基づいてこれを作成してView
にそれを渡すPresenter
あなたに
public class State {
private final boolean isServerString;
private final String serverString;
public State(boolean isServerString, String serverString) {
this.isServerString = isServerString;
this.serverString = serverString;
}
public boolean isServerString() {
return isServerString;
}
public String getServerString() {
return serverString;
}
}
文字列tのFormatter
を要求するビューを見ることができるように
public class MyActivity extends Activity implements MessageView {
private MessageFormatter formatter;
private TextView messageTextView;
@Override
public setMessage(State state) {
String message = formatter.getMessage(state);
messageTextView.setText(message);
}
}
:「がの線に沿って何かを持っているdはo TextViewに表示されます。これは、コンストラクタのparamとしてContext
を取り、、はい、それはそれでロジックを少し持っているん
public class MessageFormatter {
private Context context;
public MessageFormatter(Context context) {
this.context = context;
}
public String getMessage(State state) {
return state.isServerString()
? state.getServerString()
: context.getString(R.string.default_message);
}
}
:フォーマッタは、次のようになります。しかし、重い持ち上げロジックはPresenter
に残っています。ほとんどの場合、単純なブールチェックでなければなりません。あなたがFormatter
インターフェイスを作成し、その後、あなたがPresenter
Formatter
をインスタンス化するを決定するために使用する場合
この方法を使用することの本当の力は戦場に出ます。たとえば、HoliidayMessageFormatter
とDefaultMessageFormatter
を作成すると、Presenter
の小さなロジックチェックに基づいてアプリに別のテーマを割り当てることができます。
私はプレゼンターに注入された(そしてアプリケーションコンテキストが注入されている)ResourceProviderクラスを作成しました。 この方法では、必要に応じてプレゼンターがAndroidリソースにアクセスできますが、Androidクラスからはほとんど分離されています。 あなたのソリューションは良い選択です!アイデアをありがとう。 – starkej2
あなたの 'ResourceProvider'は、検討する価値のあるソリューションのように聞こえます。 'R.string.etc' intsを直接公開しているか、Stringsを返していますか? – Jahnold
これは文字列を返します。 – starkej2