这段代码是什么意思?里面的newInstance()的作用是什么?
这个是别人的代码:
protected void initFromIntent(int pageValue, Intent data) {
if (data == null) {
throw new RuntimeException(
"you must provide a page info to display");
}
SimpleBackPage page = SimpleBackPage.getPageByValue(pageValue);
if (page == null) {
throw new IllegalArgumentException("can not find page by value:"
+ pageValue);
}
setActionBarTitle(page.getTitle());
try {
/**
*获得一个Fragment
*/
Fragment fragment = (Fragment) page.getClz().newInstance();
Bundle args = data.getBundleExtra(BUNDLE_KEY_ARGS);
if (args != null) {
fragment.setArguments(args);
}
FragmentTransaction trans = getSupportFragmentManager()
.beginTransaction();
trans.replace(R.id.container, fragment, TAG);
trans.commitAllowingStateLoss();
mFragment = new WeakReference<Fragment>(fragment);
} catch (Exception e) {
e.printStackTrace();
throw new IllegalArgumentException(
"generate fragment error. by value:" + pageValue);
}
}
通过调用getPageByValue()获得page
public enum SimpleBackPage {
FEEDBACK(1, R.string.setting_about, FeedBackFragment.class),
ABOUT(2, R.string.setting_about, AboutFrament.class);
private int values;
private int title;
private Class<?> cls;
private SimpleBackPage(int values, int title, Class<?> cls) {
this.values = values;
this.title = title;
this.cls = cls;
}
public int getValues() {
return values;
}
public void setValues(int values) {
this.values = values;
}
public Class<?> getCls() {
return cls;
}
public void setCls(Class<?> cls) {
this.cls = cls;
}
public int getTitle() {
return title;
}
public void setTitle(int title) {
this.title = title;
}
public static SimpleBackPage getPageValue(int val) {
for (SimpleBackPage p : values()) {
if (p.getValues() == val) {
return p;
}
}
return null;
}
}
PHP中文网2017-04-17 14:48:21
newInstance は Class クラスのメソッドであり、クラスの新しいインスタンスを作成するために使用されます。
<時間>コードの観点から見ると、このコードは複数のフラグメントの相互作用をカプセル化しています。
渡されるパラメータは Fragment のクラス定義です。これにより、Fragment の不要なインスタンス化を回避できます。Class を介して Fragment をインスタンス化するには、newInstance() メソッドを使用する必要があります。
伊谢尔伦2017-04-17 14:48:21
SimpleBackPage は列挙型であり、その目的は数値を通じて対応する Fragment クラスを取得することです。
SimpleBackPage ページ = SimpleBackPage.getPageValue(pageValue);
// pageValue=1 の場合、getCls は FeedBackFragment.class を返します。
// pageValue=2 の場合、getCls は AboutFrameent.class を返します
ページ.getCls();
public enum SimpleBackPage {
FEEDBACK(1, R.string.setting_about, FeedBackFragment.class),
ABOUT(2, R.string.setting_about, AboutFrment.class);
private SimpleBackPage(int 値, int タイトル, Class<?> cls) {
this.values = 値;
this.title = タイトル;
this.cls = cls;
}
public Class<?> getCls() {
CLSを返します。
<時間>
Fragment.class.newInstance()
パラメータなしのコンストラクターを呼び出して、このクラスのインスタンスを作成して返します。
結果は次と同等です: new Fragment();
そのようなコンストラクターが存在しない場合、または作成が失敗した場合は、このクラスによって表されるクラスの新しいインスタンスを返します。使用可能なメモリが不足している場合、またはコンストラクターによって例外がスローされた場合は、InstantiationException がスローされます。デフォルトのコンストラクターが存在しても、このメソッドが呼び出されたコンテキストからアクセスできない場合は、IllegalAccessException がスローされます。投げられました。
Fragment.class.newInstance()
は new Fragment()
ほど明確ではないように感じます。また、try/catch 例外タイプ IllegalAccessException
も追加する必要があります。