我有一个自定义ScrollView,如果它是模拟器中唯一的东西,它可以正常工作。
例如,这很好用:
public class Timeline2Activity extends Activity {
private TimelineView tlv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tlv = new TimelineView(this);
setContentView(tlv);
}
}
但是,如果我先添加小部件,那么就无法显示。我已经搜索和实验了2天,没有任何作用。
以下是自定义ScrollView的类声明:
public class TimelineView extends ScrollView implements OnTouchListener {
以下是构造函数:
public TimelineView(Context context) {
super(context);
this.setOnTouchListener(this);
setVisibility(VISIBLE);
}
//the following constructor is needed to inflate the view from XML
public TimelineView(Context context, AttributeSet ats) {
super(context,ats);
this.setOnTouchListener(this);
setVisibility(VISIBLE);
}
这是main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<Button
android:id="@+id/zoomall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Zoom All" />
<Button
android:id="@+id/zoomout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="-" />
<Button
android:id="@+id/zoomin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="+" />
<Spinner
android:id="@+id/category_spinner"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:prompt="@string/category_prompt"
/>
</LinearLayout>
<com.projects.timeline2.TimelineView
android:id="@+id/timeline_view"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
以下是主要计划:
public class Timeline2Activity extends Activity {
private TimelineView tlv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//tlv = new TimelineView(this);
//setContentView(tlv);
setContentView(R.layout.main);
Spinner spinnerCategory = (Spinner) findViewById(R.id.category_spinner);
ArrayAdapter<CharSequence> adapterCategory = ArrayAdapter.createFromResource(
this, R.array.categories, android.R.layout.simple_spinner_item);
adapterCategory.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerCategory.setAdapter(adapterCategory);
spinnerCategory.setOnItemSelectedListener(new MyOnItemSelectedListener());
//TimelineView tlv = (TimelineView) findViewById(R.id.timeline_view);
//ViewGroup container = (ViewGroup) findViewById(R.id.container);
//container.addView(tlv);
}
public class MyOnItemSelectedListener implements OnItemSelectedListener {
public void onItemSelected(AdapterView<?> parent,
View view, int pos, long id) {
Toast.makeText(parent.getContext(), "The selection is " +
parent.getItemAtPosition(pos).toString(), Toast.LENGTH_LONG).show();
}
public void onNothingSelected(AdapterView parent) {
// Do nothing.
}
}
}
注释掉的行是我尝试过但却无法正常工作的东西。
此代码正确地将3个按钮和一个微调器放在顶部的水平行中。但是TimelineView无法显示在它们下面。我知道TimelineView正在运行,因为我可以在我放入的LogCat中看到调试输出。
我在我的智慧结束,并希望有人可以解释一下。这似乎是一个共同的基本需求,当然值得谷歌教程。
答案 0 :(得分:2)
你正在使用LinearLayout而你已经使用android:layout_height="fill_parent
“到第一个元素,所以第一个元素将填满整个屏幕高度,第二个元素将没有空间(com.projects.timeline2.TimelineView)这就是为什么你无法看到第二个元素。
使用相对布局。并提及android:layout_alignParentBottom="true"
第二个元素,以便它始终保持在屏幕的底部,并通过将android:layout_above
放到第一个元素
您的XML将
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<com.projects.timeline2.TimelineView
android:id="@+id/timeline_view"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
/>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal"
android:layout_above="@+id/timeline_view">
<Button
android:id="@+id/zoomall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Zoom All" />
<Button
android:id="@+id/zoomout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="-" />
<Button
android:id="@+id/zoomin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="+" />
<Spinner
android:id="@+id/category_spinner"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:prompt="category_prompt"
/>
</LinearLayout>
</RelativeLayout>
答案 1 :(得分:0)
我认为您应该将TimeLine的布局高度更改为xml中的fill_parent,或者向其中添加一些内容。
答案 2 :(得分:0)
我终于明白了。这是有效的main.xml。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/buttons"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_alignParentTop="true"
>
<Button
android:id="@+id/zoomall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Zoom All" />
<Button
android:id="@+id/zoomout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="-" />
<Button
android:id="@+id/zoomin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="+" />
<Spinner
android:id="@+id/category_spinner"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
<com.projects.timeline2.TimelineView
android:id="@+id/timeline_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignParentBottom="true"
android:layout_below="@id/buttons"
/>
</RelativeLayout>
感谢大家让我朝着正确的方向前进!