Har*_*old 58 android android-layout
我想在自定义ViewGroup类中扩展XML-Layout-File,我的问题是它只生成一个空屏幕.在Activity Class中执行相同操作可以正常工作.这是我简单的XML-Layout-File:
shownumberlayout.xml:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFFFFF"
android:id="@+id/layoutForNumber">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tvNumber"
android:layout_centerHorizontal="true"
android:textColor="#000000"
android:text="Test"
android:layout_centerVertical="true"
android:textSize="30dip">
</TextView>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
这是工作版本,shownumberlayout.xml在Activity中膨胀ShowNumber:
ShowNumber.class
public class ShowNumber extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ViewGroup vg = (ViewGroup) inflater.inflate(R.layout.shownumberlayout, null);
setContentView(vg);
}
}
Run Code Online (Sandbox Code Playgroud)
这显示白色背景,黑色文本"测试"居中.
现在版本在Custom ViewGroup-Class中膨胀xml :
ViewGroup.class
public class ViewNumber extends ViewGroup {
private LayoutInflater inflater;
public ViewNumber(Context context) {
super(context);
// TODO Auto-generated constructor stub
initView(context);
}
public ViewNumber(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
initView(context);
}
public ViewNumber(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
initView(context);
}
private void initView(Context context){
inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.shownumberlayout, null);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
// TODO Auto-generated method stub
}
}
Run Code Online (Sandbox Code Playgroud)
ShowNumber.class public class ShowNumber extends Activity {/**首次创建活动时调用.*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ViewGroup vg = new ViewNumber(this);
setContentView(vg);
}
Run Code Online (Sandbox Code Playgroud)
}
我这样做基本上就像在这个答案解释.这只会产生一个空黑屏.我做错了什么?
更新1
@Konstantin 我应用了你的更改,但仍然只是一个空白的屏幕,我也做了一个日志输出来获得孩子的数量.它始终为1,即使我再添加一个Textview到XML-Layout-File.在更改之前,它始终为0.
public class ViewNumber extends RelativeLayout {
...
private void initView(Context context){
//inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//inflater.inflate(R.layout.shownumberlayout, null);
View.inflate(context, R.layout.shownumberlayout,this);
Log.v("ViewNumber", "Number of Child: " + this.getChildCount());//output is 1,before it remains 0
}
...
}
Run Code Online (Sandbox Code Playgroud)
@Sankar这是Logst,在康斯坦丁的变化之后:
12-16 09:24:23.606: DEBUG/AndroidRuntime(8951): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<
12-16 09:24:23.606: DEBUG/AndroidRuntime(8951): CheckJNI is OFF
12-16 09:24:23.606: DEBUG/dalvikvm(8951): creating instr width table
12-16 09:24:23.656: DEBUG/AndroidRuntime(8951): --- registering native functions ---
12-16 09:24:23.916: DEBUG/AndroidRuntime(8951): Shutting down VM
12-16 09:24:23.916: DEBUG/dalvikvm(8951): Debugger has detached; object registry had 1 entries
12-16 09:24:23.916: INFO/AndroidRuntime(8951): NOTE: attach of thread 'Binder Thread #3' failed
12-16 09:24:24.076: DEBUG/AndroidRuntime(8960): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<
12-16 09:24:24.076: DEBUG/AndroidRuntime(8960): CheckJNI is OFF
12-16 09:24:24.076: DEBUG/dalvikvm(8960): creating instr width table
12-16 09:24:24.126: DEBUG/AndroidRuntime(8960): --- registering native functions ---
12-16 09:24:24.376: INFO/ActivityManager(78): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=org.customview.harold/.ShowNumber }
12-16 09:24:24.426: DEBUG/AndroidRuntime(8960): Shutting down VM
12-16 09:24:24.426: DEBUG/jdwp(8960): Got wake-up signal, bailing out of select
12-16 09:24:24.426: DEBUG/dalvikvm(8960): Debugger has detached; object registry had 1 entries
12-16 09:24:24.456: INFO/AndroidRuntime(8960): NOTE: attach of thread 'Binder Thread #3' failed
12-16 09:24:24.456: VERBOSE/ViewNumber(8923): Number of Child: 1
12-16 09:24:24.496: VERBOSE/RenderScript_jni(164): surfaceDestroyed
12-16 09:24:24.526: INFO/ActivityManager(78): Displayed activity org.customview.harold/.ShowNumber: 104 ms (total 104 ms)
12-16 09:24:24.576: DEBUG/dalvikvm(158): GC_FOR_MALLOC freed 10631 objects / 526248 bytes in 52ms
12-16 09:24:34.606: DEBUG/dalvikvm(164): GC_EXPLICIT freed 1776 objects / 106960 bytes in 91ms
Run Code Online (Sandbox Code Playgroud)
更新2
内容最终正确显示.缺少的是在RelativeLayout-Sublcass中覆盖Method onLayout(感谢Franco):
public class ViewNumber extends RelativeLayout {
...
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
// TODO Auto-generated method stub
for(int i = 0 ; i < getChildCount() ; i++){
getChildAt(i).layout(l, t, r, b);
}
}
...
}
Run Code Online (Sandbox Code Playgroud)
注意:稍后您还应该覆盖方法onMeasurement(),但目前内容也正确显示而不覆盖它.
现在,initView来自Franco的Method的解决方案不会将TextView与中心对齐,而是将其放在左上角.康斯坦丁的解决方案将其正确地放在视图中心:
public class ViewNumber extends RelativeLayout {
...
private void initView(Context context){
View.inflate(context, R.layout.shownumberlayout,this);
}
...
}
Run Code Online (Sandbox Code Playgroud)
tal*_*kol 43
我不知道这些答案中发生了什么.我认为onLayout手动调用有点疯狂.
该LayoutInflater.inflate功能是相当简单的.如果您正在使用接受第3个布尔参数(attachToRoot)的那个并且它是真的,它会将您的XML中的视图添加到您的父视图(第二个参数).如果您使用的是仅接受2个参数的参数,则默认情况下,如果您提供的父项不为null,则默认情况下会将true传递给attachToRoot .
在任何情况下,您遇到的大多数混乱都是因为XML中的视图被添加到您的自定义视图中.由于您的XML具有RelativeLayout根,并且您的自定义视图也是RelativeLayout- 您在相对布局中获得相对布局.
这可能不是你想要的.
康斯坦丁给出的答案是有道理的,但是你却浪费了一个观点,因为你正在放置一个RelativeLayout内部FrameLayout.由于Android无法容纳太多嵌套视图,因此优化并不添加不必要的内容是个好主意FrameLayout.
我建议保留自定义视图RelativeLayout并将XML根目录更改为<merge>.然后使用inflate表单将XML视图添加到您的父级 - 就像View.inflate(context,int,this)
<merge>标记的目的是跳过XML中的根节点.查找它.
Kon*_*rov 34
你的布局无处膨胀..让你的ViewNumber扩展FrameLayout并膨胀到它:
public class ViewNumber extends FrameLayout {
public ViewNumber(Context context) {
super(context);
initView(context);
}
public ViewNumber(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}
public ViewNumber(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView(context);
}
private void initView(Context context){
View.inflate(context, R.layout.shownumberlayout, this); //correct way to inflate..
}
}
Run Code Online (Sandbox Code Playgroud)
UPD:你也不需要覆盖onLayout方法,看起来非常不正确..至少在一开始就调用super.onLayout():
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
}
Run Code Online (Sandbox Code Playgroud)
Fra*_*nco 30
你试过这个吗?
private void initView(Context context){
inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.addView(inflater.inflate(R.layout.shownumberlayout, null));
}
Run Code Online (Sandbox Code Playgroud)
编辑:我快速回复......一个ViewGroup有责任为他们的孩子准备布局,在布局方法中试试这个:
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
// TODO Auto-generated method stub
for(int i = 0 ; i < getChildCount() ; i++){
getChildAt(i).layout(l, t, r, b);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
75980 次 |
| 最近记录: |