17

これは私を夢中にさせています。RelativeLayout を使用してレイアウトされた Android アプリにフラグメントがあります。問題は、何らかの理由でレンダリングに時間がかかり、画面に約 4 つの要素をロードするだけで約 5 秒かかることです。

要素の 1 つは 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"

この変更により、少なくとも私のSamsung Galaxy Tab 2では問題がなくなりました

したがって、「スペース」に関連しているようですが、この問題が発生する理由はまだわかりません。そして、「calendarview slow」をグーグルで検索しても、他に興味深い結果は見つかりませんでした...

EDIT 小さな報奨金で答えを見つけることができるかどうか見てみましょう

于 2013-07-22T11:35:09.970 に答える
3

CalendarView ウィジェットの高さを に設定する必要があることがわかりましたmatch_parent。その後、任意のレイアウトに配置できます。たとえば、高さ 200 の相対値です。これは、4.0.3 エミュレーターと 4.2.2 の Samsung 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 に答える