私は最近、Fragments
を作成するときに、Bundles
に引数を渡すために常にString
のキーを知ることに疲れてしまいました。そこで私はFragments
のコンストラクタを作って、設定したいパラメータをとり、正しいString
キーを使ってBundles
に入れました。そのため、これらのキーを知る必要があるFragments
とActivities
の必要性が排除されました。フラグメントを作成する:コンストラクタとnewInstance()
public ImageRotatorFragment() {
super();
Log.v(TAG, "ImageRotatorFragment()");
}
public ImageRotatorFragment(int imageResourceId) {
Log.v(TAG, "ImageRotatorFragment(int imageResourceId)");
// Get arguments passed in, if any
Bundle args = getArguments();
if (args == null) {
args = new Bundle();
}
// Add parameters to the argument bundle
args.putInt(KEY_ARG_IMAGE_RES_ID, imageResourceId);
setArguments(args);
}
そして、私はこれらの引数を普通のように引き出します。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.v(TAG, "onCreate");
// Set incoming parameters
Bundle args = getArguments();
if (args != null) {
mImageResourceId = args.getInt(KEY_ARG_IMAGE_RES_ID, StaticData.getImageIds()[0]);
}
else {
// Default image resource to the first image
mImageResourceId = StaticData.getImageIds()[0];
}
}
しかし、リントも、アプリケーションを実行するために@SuppressLint("ValidFragment")
を使用するために私を必要とし、他のパラメータを持つコンストラクタを持つFragment
のサブクラスを持っていないと言って、これで問題を取りました。問題は、このコードは完璧に機能していることです。 ImageRotatorFragment(int imageResourceId)
または古い学校の方法ImageRotatorFragment()
を使用して、setArguments()
を手作業で呼び出すことができます。 AndroidがFragment(オリエンテーションの変更またはメモリ不足)を再作成する必要があるときは、ImageRotatorFragment()
コンストラクタを呼び出し、同じ値のBundle
を渡して正しく設定されます。
私は "提案された"アプローチを探していて、newInstance()
を使って多くの例を見て、Fragments
というパラメータを作成しました。これは私のコンストラクタと同じことをしています。だから、私はそれをテストするために自分自身を作った、そしてそれは前と同じように完璧に動作し、Lintはそれについて泣いている。
public static ImageRotatorFragment newInstance(int imageResourceId) {
Log.v(TAG, "newInstance(int imageResourceId)");
ImageRotatorFragment imageRotatorFragment = new ImageRotatorFragment();
// Get arguments passed in, if any
Bundle args = imageRotatorFragment.getArguments();
if (args == null) {
args = new Bundle();
}
// Add parameters to the argument bundle
args.putInt(KEY_ARG_IMAGE_RES_ID, imageResourceId);
imageRotatorFragment.setArguments(args);
return imageRotatorFragment;
}
私は個人的にコンストラクタを使用してnewInstance()
を使用するために知っているとパラメータを渡すよりもはるかに一般的に行われていることがわかります。私はあなたがアクティビティでこの同じコンストラクタテクニックを使用することができると信じており、Lintはそれについて不平を言うことはありません。 基本的に私の質問は、なぜGoogleはFragments
のパラメータを持つコンストラクタを使用したくないのですか?
Fragment
が再作成されたときに設定されない、Bundle
を使用せずにインスタンス変数を設定しようとしないようにしてください。 static newInstance()
メソッドを使用すると、コンパイラはインスタンス変数にアクセスすることを許可しません。
public ImageRotatorFragment(int imageResourceId) {
Log.v(TAG, "ImageRotatorFragment(int imageResourceId)");
mImageResourceId = imageResourceId;
}
コンストラクタでパラメータの使用を許可しない理由はまだありません。誰もがこれについての洞察を持っていますか?