一、显示“允许”与“拒绝”的界面
①进入程序时默认加载类MainActivity,而MainActivity默认继承类BetterListActivity,在BetterListActivity的onCreate()方法中
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int cv = getContentView();
if (0 != cv)
setContentView(cv);
try {
fragment = (BetterListFragment)clazz.getConstructors()[0].newInstance();
fragment.setArguments(getIntent().getExtras());
fragment.getInternal().setListener(this);
getSupportFragmentManager().beginTransaction().replace(getListContainerId(), fragment, "betterlist").commit();
}
catch (Exception e) {
e.printStackTrace();
}
}
②由子类的构造方法
public MainActivity() {
super(PolicyFragment.class);
}
可以看出在MainAcitivity中fragement指PolicyFragment,
③ getSupportFragmentManager().beginTransaction().replace(getListContainerId(), fragment, "betterlist").commit();加载显示了PolicyFragment
二、menu菜单显示
①public abstract class FragmentInterface {
abstract public void onCreateOptionsMenu(Menu menu, MenuInflater inflater);
}
②BetterListFragmentInternal extends FragmentInterface{
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
}
}
③public class PolicyFragment extends BetterListFragment {
@Override
public PolicyFragmentInternal createFragmentInterface() {
return new PolicyFragmentInternal(this);
}
}
④public class MainActivity extends BetterListActivity {
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater mi = new MenuInflater(this);
mi.inflate(R.menu.app, menu);
MenuItem about = menu.findItem(R.id.about);
about.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
getFragment().setContent(new AboutFragment(), true,getString(R.string.about));
return true;
}
});
return super.onCreateOptionsMenu(menu);
}
}
⑤在类SupportFragment中,调用了internal.onCreateOptionsMenu(menu, inflater)方法,由③可知在显示PolicyFragment时调用的是PolicyFragmentInternal的onCreateOptionsMenu(menu, inflater)方法
public abstract class SupportFragment<T extends FragmentInterface> extends Fragment implements FragmentInterfaceWrapper {
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
internal.onCreateOptionsMenu(menu, inflater);
}
}
⑥public class PolicyFragmentInternal extends ListContentFragmentInternal {
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
MenuInflater mi = new MenuInflater(getActivity());
mi.inflate(R.menu.main, menu);
MenuItem log = menu.findItem(R.id.logs);
//log日志界面
log.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
showAllLogs();
return true;
}
});
//设置
MenuItem settings = menu.findItem(R.id.settings);
settings.setOnMenuItemClickListener(new OnMenuItemClickListener() {
void openSettingsNative(final MenuItem item) {
setContent(createSettingsNativeFragment(), true, getString(R.string.settings));
}
@Override
public boolean onMenuItemClick(final MenuItem item) {
if (getActivity() instanceof FragmentActivity) {
setContent(new SettingsFragment(), true, getString(R.string.settings));//创建了设置
}
else {
openSettingsNative(item);
}
return true;
}
});
}
}
三、关于界面的显示
④public class MainActivity extends BetterListActivity {
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater mi = new MenuInflater(this);
mi.inflate(R.menu.app, menu);
MenuItem about = menu.findItem(R.id.about);//创建了关于条目
about.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
getFragment().setContent(new AboutFragment(), true,getString (R.string.about));
return true;
}
});
return super.onCreateOptionsMenu(menu);//执行父类的方法,创建了log日志和设置界面
}
}
四、日志界面的显示
① MenuItem log = menu.findItem(R.id.logs);
log.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
showAllLogs();//当点击log图标时显示log日志界面
return true;
}
});
② void showAllLogs() {
setContent(null, null);//设置要显示的内容
getListView().clearChoices();//重置adapter的内容
}
③ void setContent(final ListItem li, final UidPolicy up) {
//该方法在类PolicyFragmentInternal中,getActivity()返回MainActivity,
//继承关系为MainActivity extends BetterListActivity
//public class BetterListActivity extends FragmentActivity
//此时getActivity() instanceof FragmentActivity条件满足
if (getActivity() instanceof FragmentActivity) {
//创建了显示log日志的fragment
LogFragment l = new LogFragment();
l.getInternal().setUidPolicy(up);//up为null
l.getInternal().setListContentId(getFragment().getId());
mContent = l;
}
else {
mContent = setContentNative(li, up);
}
//由up为null可知,下面的方法传递的参数为setContent(LogFragment ,true,“log”)
setContent(mContent, up == null, up == null ? getString(R.string.logs) : up.getName());
}
④接着跳转到父类class ListContentFragmentInternal extends BetterListFragmentInternal
public void setContent(FragmentInterfaceWrapper content, boolean clearChoices, String breadcrumb) {
mCurrentContent = content;
if (getActivity() instanceof FragmentActivity) {
Fragment f = (Fragment)mCurrentContent;
FragmentActivity fa = (FragmentActivity)getActivity();
final FragmentManager fm = fa.getSupportFragmentManager();
FragmentTransaction ft = fa.getSupportFragmentManager().beginTransaction();
//隐藏掉“允许”与“拒绝”的界面
if (isPaged()) {
View v = getFragment().getView();
Assert.assertNotNull(v);
final View l = v.findViewById(R.id.list_fragment);
Assert.assertNotNull(l);
l.setVisibility(View.GONE);
fm.addOnBackStackChangedListener(new OnBackStackChangedListener() {
{
listener = this;
}
@Override
public void onBackStackChanged() {
Fragment f = (Fragment)getFragment();
if (f.isDetached() || f.isRemoving()) {
fm.removeOnBackStackChangedListener(this);
return;
}
View v = getFragment().getView();
if (v == null)
return;
final View l = v.findViewById(R.id.list_fragment);
if (l == null)
return;
if (fm.getBackStackEntryCount() > 0 && "content".equals(fm.getBackStackEntryAt(fm.getBackStackEntryCount() - 1).getName())) {
l.setVisibility(View.GONE);
}
else {
l.setVisibility(View.VISIBLE);
}
}
});
fm.popBackStack("content", FragmentManager.POP_BACK_STACK_INCLUSIVE);
ft.setBreadCrumbTitle(breadcrumb);
ft.setBreadCrumbShortTitle(breadcrumb);
ft.addToBackStack("content");
}
//显示传过来的content界面,此时为logfragement
ft.replace(getContentId(), f, "content");
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();
}
else {
setContentNative(breadcrumb);
}
if (clearChoices)
getListView().clearChoices();
}