17

这真让我抓狂。我的 Android 应用程序中有一个片段,它使用相对布局进行布局。问题是由于某种原因渲染需要很长时间,大约 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>

我已经尝试了许多不同的布局选项,但删除日历似乎是唯一有所作为的事情。

任何见解将不胜感激。谢谢

4

6 回答 6

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 中

所以它似乎与“空间”更相关,但我仍然不确定为什么会出现这个问题。而且我在谷歌搜索“日历视图慢”时没有找到任何其他有趣的结果......

编辑 让我们看看我们是否可以通过小额赏金找到答案

于 2013-07-22T11:35:09.970 回答
5

我花了几个小时才找到答案,但不知道为什么。这里有一些奇怪的东西,它可以帮助你找到答案。

CalendarView慢时的cpu消耗 在此处输入图像描述

WeekAdapter 中的 getView 有一个从未使用过的参数父级。

   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;
    }

期待答案。

于 2013-08-05T15:04:06.327 回答
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>
于 2013-12-05T13:48:08.627 回答
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>
于 2013-08-05T15:47:53.313 回答
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>
于 2015-04-12T21:37:30.923 回答
0

上面的答案是正确的,但仍然没有解开一个谜。

也就是说,当我想在布局中包含日历视图和其他布局时。它只是消失了,或者我只能看到周信。我尝试了上面的匹配父母和一切,但我仍然无法解决它。

如果有人像我一样挣扎这是答案。

   <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 


     />
于 2015-09-20T11:31:24.967 回答