2016-11-02 18 views
2

最近、モデルビュープレゼンターアーキテクチャーを使用したAndroidアプリの開発を開始しました。私が良い解決策を見つけることができなかったという問題は、プレゼンターの文字列を渡して表示することです。Android MVP - プレゼンターからビューへの文字列リソースの受け渡し

ユニットテストを容易にするために、Androidシステムの依存関係をプレゼンターレイヤーから外しているようにしています。サーバーや他の外部ソースからの文字列を提供する場合、これは簡単です。私はいつも同じ単純なエラーメッセージを表示する必要があるとき、私はちょうどshowWhateverError()のようなメソッドを持つことができます。ここでビューは、どの文字列リソースを使用するかを既に知っていて、リソース自体のロードを処理できます。そして、ビューを提供する文字列リソースを決定するビジネスロジックがあるとき、プレゼンターの文字列リソースIDを参照できます(間違っているとは思いますが)。

私が良い解決策を見出せなかったのは、ときにはサーバーから来て、時にはビジネスロジックに基づいて文字列リソースであることがある文字列を表示する必要がある場合です。どんなアイデアも参考になるでしょう!

答えて

2

についてこれらの状況には私が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インターフェイスを作成し、その後、あなたがPresenterFormatterをインスタンス化するを決定するために使用する場合

この方法を使用することの本当の力は戦場に出ます。たとえば、HoliidayMessageFormatterDefaultMessageFormatterを作成すると、Presenterの小さなロジックチェックに基づいてアプリに別のテーマを割り当てることができます。

+0

私はプレゼンターに注入された(そしてアプリケーションコンテキストが注入されている)ResourceProviderクラスを作成しました。 この方法では、必要に応じてプレゼンターがAndroidリソースにアクセスできますが、Androidクラスからはほとんど分離されています。 あなたのソリューションは良い選択です!アイデアをありがとう。 – starkej2

+0

あなたの 'ResourceProvider'は、検討する価値のあるソリューションのように聞こえます。 'R.string.etc' intsを直接公開しているか、Stringsを返していますか? – Jahnold

+0

これは文字列を返します。 – starkej2

1

エラーメッセージの視覚化は、View!を使用して処理する必要があります。

あなたのプレゼンターは、たとえばinvalidEmail()などの関連するエラーメソッドを呼び出す必要があり、ビューはユーザーとのやりとり方法を決定し、UI要素を使用してエラーを表示する必要があります。

一部の実装では、メッセージの代わりにアニメーションを表示することができます。したがって、下位層からのメッセージを表示することは正しくありません。ここで

はMVP、ダガー、テストおよびその他の概念についてより多くを学ぶことであなたを助けることができるサンプルレポです:

http://github.com/mmirhoseini/marvel

私はそれが助けを願っ:)

関連する問題