这段代码是什么意思?里面的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;
}
}
newInstance 是 Class 类的方法,作用是新建类的实例
从代码来看,这段代码是把多个Fragment的交互做了一个封装。
传入的参数是Fragment的Class定义,这样就能避免不必要的Fragment实例化,而通过Class去实例化Fragment则需要使用newInstance() 这个方法。
根据问题追加的代码Update
SimpleBackPage是enum类型,意图是通过数字获取对应的Fragment类:
当拿到Fragment类后
Fragment.class.newInstance()
通过调用该类的无参数构造器,创建并返回该类的一个实例。从结果上看等价于:
new Fragment();
感觉上
Fragment.class.newInstance()
不如new Fragment()
清楚明了。而且你还要为其添加try/catchexception type IllegalAccessException
.