这让我发疯了。我的Android应用程序中有一个片段,它使用RelativeLayout进行布局。问题是,由于某种原因渲染需要很长时间,大约5秒钟才能在屏幕上加载大约4个元素。
其中一个元素是CalendarView,当我删除它时,它会恢复到正常速度(即:即时)。我想这个问题与我要求Android解决这个问题的方式有关,一定不是很有意义,也不是效率低下的东西。
这是XML文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="20dp">
<TextView
android:id="@+id/title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:textStyle="bold"
android:text="TODAY"
android:textAppearance="?android:attr/textAppearanceLarge"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_toLeftOf="@+id/time" />
<TextView
android:id="@id/time"
android:gravity="right"
android:textStyle="bold"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="11:32"
android:textAppearance="?android:attr/textAppearanceLarge"
android:layout_alignParentRight="true" />
<TextView
android:id="@+id/date_info"
android:layout_margin="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Wednesday, 15th August 2012"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_below="@id/title"
android:layout_alignParentLeft="true" />
<CalendarView
android:id="@+id/calendar_view"
android:layout_width="250dp"
android:layout_height="250dp"
android:background="@drawable/white_back_black_border"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true" />
</RelativeLayout>
我尝试了大量不同的布局选项,但删除日历似乎是唯一有所作为。
任何见解都将不胜感激。感谢
答案 0 :(得分:6)
我也有这个问题,包括相对布局和线性布局。它似乎与布局无关。
这是一个看错误的例子,只是简单的布局,根本没有代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".FechaHoraActivity" >
<TimePicker
android:id="@+id/timePicker1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp" />
<CalendarView
android:id="@+id/calendarView1"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
现在只需将线性布局高度更改为:
android:layout_height="match_parent"
有了这个改变,问题就消失了,至少在我的三星Galaxy Tab 2
中所以它似乎更多&#34;空间&#34;有关,但我还不确定为什么会出现这个问题。而且我还没有在谷歌搜索中找到任何其他有趣的结果&#34; calendarview slow&#34; ...
编辑 让我们看看我们是否能以小额赏金找到答案
答案 1 :(得分:5)
我花了几个小时才找到答案,但没弄清楚原因。这有点奇怪,可以帮助你找到答案。
CalendarView缓慢时的CPU消耗
WeekAdapter中的getView有一个从未使用的param父级。
public View getView(int position, View convertView, ViewGroup parent) {
WeekView weekView = null;
if (convertView != null) {
weekView = (WeekView) convertView;
} else {
weekView = new WeekView(mContext);
android.widget.AbsListView.LayoutParams params =
new android.widget.AbsListView.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
weekView.setLayoutParams(params);
weekView.setClickable(true);
weekView.setOnTouchListener(this);
}
int selectedWeekDay = (mSelectedWeek == position) ? mSelectedDate.get(
Calendar.DAY_OF_WEEK) : -1;
weekView.init(position, selectedWeekDay, mFocusedMonth);
return weekView;
}
期待答案。
答案 2 :(得分:3)
似乎直接在RelativeLayout内部的CalendarView确实不能很好地工作。使用FrameLayout技巧的以下解决方案在模拟器中加载速度要快得多:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="20dp" >
<TextView
android:id="@+id/title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_toLeftOf="@+id/time"
android:text="TODAY"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textStyle="bold" />
<TextView
android:id="@id/time"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:gravity="right"
android:text="11:32"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textStyle="bold" />
<TextView
android:id="@+id/date_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@id/title"
android:layout_margin="20dp"
android:text="Wednesday, 15th August 2012"
android:textAppearance="?android:attr/textAppearanceMedium" />
<FrameLayout
android:layout_width="250dp"
android:layout_height="250dp"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true" >
<CalendarView
android:id="@+id/calendar_view"
android:layout_width="250dp"
android:layout_height="250dp"
android:background="@drawable/white_back_black_border" />
</FrameLayout>
</RelativeLayout>
答案 3 :(得分:3)
发现CalendarView小部件需要将高度设置为match_parent
,然后您可以将它放到任何布局中。例如,相对于高度为200.这适用于4.0.3模拟器和带有4.2.2的三星Galaxy Tab。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true" >
<CalendarView
android:id="@+id/cv_dialog_filter_date"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/relativeLayout2"
android:layout_centerHorizontal="true"
android:text="05.12.2013" />
</RelativeLayout>
答案 4 :(得分:2)
将CalendarView放在FrameLayout中可以解决问题。 这是一个XML代码示例:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#cc00b1cc">
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="102dp"
android:layout_alignParentBottom="true">
<CalendarView
android:layout_width="425dp"
android:layout_height="374dp"
android:id="@+id/calendarView"
android:layout_gravity="left|top" />
</FrameLayout>
</RelativeLayout>
答案 5 :(得分:0)
上述答案是正确的,但仍然没有解开一个谜。
也就是说,当我想在其他布局中包含内部布局的calendarview时。它只是消失或我只能看到周信。我尝试了上面的匹配父母和一切,但我仍然无法解决它。
如果有人像我一样挣扎,这就是答案。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:descendantFocusability="blocksDescendants"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<CalendarView
android:id="@+id/calendarService"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/linearLayout"></CalendarView>
<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:orientation="vertical">
///Your views
/>