android原生browser分析(二)

我们先看一张浏览器的主界面,上面标示浏览器界面各部分对应的类,这里是以平板上的界面为例。给张图是为了给大家一个直观的感觉。

BrowserActivity是整个应用的主界面,在onCreate中创建了Controller对象,Controller对象是整个应用最重要的管理类,这个后面再说。

@Overridepublic void onCreate(Bundle icicle) {mController = createController();}

Controller的创建中新建了UI类,UIBrowserActivity中布局文件中视图ID一一对应起来,关于这点后面描述。

private Controller createController() {Controller controller = new Controller(this);boolean xlarge = isTablet(this);UI ui = null;if (xlarge) {ui = new XLargeUi(this, controller);} else {ui = new PhoneUi(this, controller);}controller.setUi(ui);return controller;}

由上,我们看到根据isTablet()方法获取的值,将会创建不同的UI类。

看一下isTablet()方法:

public static boolean isTablet(Context context) {return context.getResources().getBoolean(R.bool.isTablet); }

可以看出,这里是通过一个资源文件的值来确定的,实际上这里是用来区分这个是手机应用还是平板应用的。取值为true的时候获取的是XLargeUi对象,取值为false由于我的项目是平板的,就以XLargeUi为例进行分析。

在此,我们把这几个类的继承关系理一理:

public interface UI {//….} public abstract class BaseUi implements UI {//…} public class XLargeUi extends BaseUi {//…} public class PhoneUi extends BaseUi {//…}

我们现在来看看XLargeUi的定义:

public class XLargeUi extends BaseUi {private ActionBar mActionBar;private TabBar mTabBar;private NavigationBarTablet mNavBar;/*** @param browser* @param controller*/public XLargeUi(Activity browser, UiController controller) {super(browser, controller);//other codemNavBar = (NavigationBarTablet) mTitleBar.getNavigationBar();mTabBar = new TabBar(mActivity, mUiController, this);mActionBar = mActivity.getActionBar();setupActionBar();}private void setupActionBar() {mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);mActionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);mActionBar.setCustomView(mTabBar);} //other code}

构造方法中传入了两个参数,第一个是应用的主界面

构造函数中主要做了下面的事情:

1mTitleBar获取NavigationBarTablet类型的对象mNavBar,这个对象即是导航工具栏。就是浏览器界面的如下的工具栏

该对象主要用于更新导航栏的状态,即对前进后退键、URL输入框、URL图标进行操作。

成员变量mTitleBar是从BaseUi继承而来的。

2、新创建一个TabBar类型的对象,这个TabBar对象是只有平板才有的。创建时传入主界面BrowserActivity、UiController对象、XLargeUi自身。创建的对象即选项卡栏

该对象将用来进行选项卡的相关操作,增加、删除、更新选项卡,改变收藏夹图标favicon

3、通过主界面BrowserActivity获取ActionBar对象。

4TabBar对象设置为ActionBar的自定义视图。

关于BaseUi

BaseUi是平板界面XLargeUi和手机界面PhoneUi共有的父类。

public abstract class BaseUi implements UI {Activity mActivity;UiController mUiController;TabControl mTabControl;private UrlBarAutoShowManager mUrlBarAutoShowManager;protected TitleBar mTitleBar;private NavigationBarBase mNavigationBar;protected PieControl mPieControl;public BaseUi(Activity browser, UiController controller) {mActivity = browser;mUiController = controller;mTabControl = controller.getTabControl();FrameLayout frameLayout = (FrameLayout) mActivity.getWindow().getDecorView().findViewById(android.R.id.content);LayoutInflater.from(mActivity).inflate(R.layout.custom_screen, frameLayout);//…setFullscreen(BrowserSettings.getInstance().useFullscreen());mTitleBar = new TitleBar(mActivity, mUiController, this,mContentView);mTitleBar.setProgress(100);mNavigationBar = mTitleBar.getNavigationBar();mUrlBarAutoShowManager = new UrlBarAutoShowManager(this);}}

先从构造方法来看:

构造方法传入了两个参数:第一个是应用的主界面BrowserActivity,第二个是UiController对象,也就是创建XLargeUi时传入的两个参数。

构造方法中主要完成了如下的事情:

1

2

FrameLayout frameLayout = (FrameLayout) mActivity.getWindow().getDecorView().findViewById(android.R.id.content);LayoutInflater.from(mActivity).inflate(R.layout.custom_screen, frameLayout);

这里是将资源文件对应的视图加入到

原来

public void setContentView(int layoutResID) {getWindow().setContentView(layoutResID);//…}

Activity中:

public Window getWindow() {return mWindow;}mWindow = PolicyManager.makeNewWindow(this);莫愁前路无知己,天下谁人不识君。

android原生browser分析(二)

相关文章:

你感兴趣的文章:

标签云: