安卓APP不同的活动一般都有相同的地方。 最典型的是“标题栏”(titlebar ),您只需在每个activity中调用setTitle即可获得完全相同的标题栏,但标题字符之间的差异除外。
系统引入了类似titlebar的功能,但是如果需要像titlebar这样容易复制的bottombar怎么办?
当然,是否需要bottombar是个问题,但我想说的是,如果实际上我想让activity共享部分UI,该怎么办?
直观上,您将创建一个activity子类,在此子类的activity中实现公共UI,将其命名为BaseActivity,最后共享此部分UI的所有activity将继承此BaseActivity。
想法是这样的,那么这个基本活动该怎么写呢? 请注意上面的蓝色词。 如果公共UI是在setContentView中呈现的,那么是否应该处理基本活动子类的唯一UI? 合理地说,在BaseActivity子类中调用和显示setContentView
现在的情况是,我们想得到公共UI,但是不能将公共部分和独自部分的UI分开处理。 解决问题的方法是了解活动布局是如何配置的,以及setContentView在做什么。
另一方面,DecorView是窗口接口整体的最高位View。
二.译码器视图只有一个子元素是线性布局。 表示整个窗口界面,包含通知栏、标题栏、内容显示栏三个区域。
三.线性布局有两个框架布局子元素。
(20 )显示标题栏的画面。 只有一个TextView显示APP应用程序的名称。 也可以自定义标题栏。 加载的自定义标题栏视图将添加到框架布局中。
(21 )在内容栏中显示画面。 setContentView ) )方法加载的布局接口,用于加入其中。
因此,要实现具有activity公共部分的UI,请重写setContentView ()方法。 导入安卓. app.activity;
导入安卓. OS.bundle;
import Android.view.layoutinflater;
导入安卓. view.view;
导入安卓. view.view group;
导入安卓. view.view.onclick listener;
导入安卓. view.view group.layout params;
import Android .构件. linear layout;
import Android .构件. textview;
publicclassbaseactivityextendsactivity {
私密性textview m title tx;
隐私视图m后退;
私有互联网联盟内容中心;
@Override
protectedvoidoncreate (边界维护实例state )。
super.oncreate (savedinstancestate;
initContentView (
initTitleBar (;
}
公共语音导入标题栏
mtitletx=(textview ) findviewbyid ) r.id.titlebar_title;
m back=findviewbyid (r.id.titlebar _ left;
m back.setonclicklistener (newonclicklistener ) )。
@Override
公共语音在线(视图视图) {
finish (;
}
);
}
私有语音识别内容视图(
viewgroupcontent=(viewgroup ) findviewbyid ) Android.r.id.content );
content.removeAllViews (;
内容布局=newlinearlayout (this;
内容布局. set orientation (linear layout.vertical;
内容. add view (内容布局;
layoutinflater.from(this ).inflate ) r.layout.common_title_bar,contentLayout,true );
}
@Override
publicvoidsetcontentview (intlayoutresid ) {
//viewcustomcontentview=layoutinflater.from (this ).inflate ) layoutresid,null );
/*this is the same result with
viewcustomcontentview=layoutinflater.from (this ).inflate ) layoutresid,contentLayout,false );
*/
//content layout.add view (customcontentview,LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT );
layoutinflater.from(this ).inflate ) layoutresid,contentLayout,true );
}
@Override
公共语音内容视图(viewcustomcontentview )。
内容布局. add view (customcontentview;
}
@Override
publicvoidsettitle (charsequencetitle ) {
mtitletx.settext(title );
}
}
(查看组) findviewbyid (Android.r.id.content )可以获取乘以一个活动内容部分的线性布局。 将linearlayoutcontentlayout=newlinearlayout (this )添加到此线性布局; 内容布局. set orientation (linear layout.vertical;
内容. add view (内容布局;
作为新的内容区域。
然后,将公用部分的UI添加到新的内容区域。 layoutinflater.from(this ).inflate ) r.layout.common_title_bar,contentLayout,true );
在这里,我们定制了标题栏作为通用部分,但实际上如果是标题栏,就不用那么麻烦,直接使用本机titlebar就可以了。
然后,重写setContentView,将子类的内容区域从原来应该直接乘以android.R.id.content的区域更改为乘以此新内容区域。 代码如下。 @Override
publicvoidsetcontentview (intlayoutresid ) {
layoutinflater.from(this ).inflate ) layoutresid,contentLayout,true );
}