必要なデータが欠落している場合、ユーザーはプロンプトを表示する必要がある場合があります。たとえば、空のリスト、サーバーエラー、インターネット接続がありません。ヒントが複雑で、ケースごとに異なる必要がある場合は、どうすればよいですか?以下の実装は、これらの問題に対処する必要があります。
要するに、補助情報を表示する義務は別のオブジェクトに割り当てられているということです。これにより、ロジックをより正確に分離し、アクティビティ内のコードを減らすことができます。実装のより詳細な説明に進みましょう。
各ヒントは、何でも含めることができる個別のフラグメントです。それらを管理するには、オブジェクトにFragmentManagerと、フラグメントが存在する必要のあるコンテナーのIDが必要です。これ以上の依存関係はありません。
各状況は、このオブジェクトにネストされた列挙要素です(すべてがコードで非常に明確になります)。ヒントを変更する必要がある場合は、置換を担当するメソッドが呼び出され、新しいシチュエーションが渡されます。これはすべて論理です。
今、これはAndroidの現実で行われなければなりません。オブジェクトを必要とするアクティビティ(またはフラグメント)自体を除いて、他の誰もそれを参照しません。初期の「デフォルト」状態があります。新しい値が表示されるまで、最初に表示されたときに表示されます。値自体はLiveData(ViewModelにあります)に格納され、アクティビティはこれをサブスクライブして、新しい値をオブジェクトに渡します。これにより、アクティビティの再現を体験し、状態を維持することができます。
例としてHTTPステータスコードを使用することにしましたが、どのコードでも使用できます。たとえば、リリース日、監督、俳優などに関する条件のある映画のデータベースを照会する場合です。さまざまな手がかりが表示される場合があります。必要な俳優、この日付の映画、この監督にはそのような映画はありません。
ニュアンス
たとえば、データのリストをクリアしない場合、ヒントがこのリストの上(または下)に表示される可能性があり、これは見苦しいものになります。これを行うには、最初にリストをクリアする必要があります(または、リストの表示を非表示にします。どちらが良いですか?)。
実装
CodeSwitcher。
CodeSwitcher。ふさわしい名前が思いつかなかった。
//
public class CodeSwitcher {
//
public enum Code {
DEFAULT,
HTTP_OK,
HTTP_CREATED,
HTTP_BAD_REQUEST,
HTTP_NOT_FOUND,
NO_DATA
}
//
private FragmentManager fragmentManager;
private int fragmentHostId;
public CodeSwitcher(FragmentManager fragmentManager, int fragmentHostId) {
this.fragmentManager = fragmentManager;
this.fragmentHostId = fragmentHostId;
}
//,
public void switchFragments(Code code) {
FragmentTransaction transaction = fragmentManager.beginTransaction();
switch (code) {
case HTTP_OK:
transaction.replace(fragmentHostId, CodeFragment.newInstance("HTTP_OK"));
break;
case HTTP_CREATED:
transaction.replace(fragmentHostId, CodeFragment.newInstance("HTTP_CREATED"));
break;
case HTTP_BAD_REQUEST:
transaction.replace(fragmentHostId, CodeFragment.newInstance("HTTP_BAD_REQUEST"));
break;
case HTTP_NOT_FOUND:
transaction.replace(fragmentHostId, CodeFragment.newInstance("HTTP_NOT_FOUND"));
break;
case NO_DATA:
transaction.replace(fragmentHostId, CodeFragment.newInstance("NO_DATA"));
break;
default:
transaction.replace(fragmentHostId, CodeFragment.newInstance("Default"));
break;
}
transaction.commit();
}
}
// ViewModel
//
public CodeShowActivityViewModel() {
listCode = new MutableLiveData<>();
listCode.setValue(CodeSwitcher.Code.DEFAULT);
}
// , ,
public void httpOk() {
listCode.setValue(CodeSwitcher.Code.HTTP_OK);
clearList();
}
public void httpBadRequest() {
listCode.setValue(CodeSwitcher.Code.HTTP_BAD_REQUEST);
clearList();
}
// ,
private CodeSwitcher switcher;
// onCreate()
switcher = new CodeSwitcher(getSupportFragmentManager(), R.id._);
// LiveData,
codeActVM.getListCode().observe(this, code -> {
switcher.switchFragments(code);
});
説明付きのGIF(4MB)
最初からデフォルトの状態が表示され、特別にバックグラウンドで表示されますが、実際には空である必要があります。次に、さまざまなコードの受信とその表示がエミュレートされます。最後に、アクティビティが再作成されても状態が持続することが示されます。
この方法についてどう思いますか?
PS
名前のトラブル..。