ssomai / ScalableLayout

Scalable Layout For Android
Apache License 2.0
269 stars 87 forks source link

WrapContent 에 대한 문의 입니다. #60

Open koocci opened 6 years ago

koocci commented 6 years ago

먼저, 라이브러리 정말 잘 쓰고 있습니다. 감사하다는 말씀 먼저 드리고 싶습니다. 다만, 제가 잘못 사용한 것인지, ListView Item에서 WrapContent로 TextView 를 Text 길이에 맞게 하단으로 늘려주려고 했습니다만, 한 두개씩 Text가 한줄밖에 출력이 되지 않는 상황이 발생합니다.

<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="horizontal">

<com.ssomai.android.scalablelayout.ScalableLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:scale_base_width="600"
    app:scale_base_height="250">

    <android.support.v7.widget.AppCompatImageView
        android:layout_width="wrap_content"
        android:id="@+id/msg_status"
        android:layout_height="wrap_content"
        android:background="@color/colorBlue"
        app:scale_height="250"
        app:scale_left="10"
        app:scale_top="0"
        app:scale_width="15"/>

    <android.support.v7.widget.AppCompatCheckBox
        android:id="@+id/msg_chk"
        android:theme="@style/CustomCheckBox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:focusable="false"
        android:clickable="false"
        app:scale_height="200"
        app:scale_left="40"
        app:scale_top="0"
        app:scale_width="55"/>

    <de.hdodenhof.circleimageview.CircleImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/empty_player"
        app:scale_height="100"
        app:scale_left="100"
        app:scale_top="50"
        app:scale_width="100"/>

    <android.support.v7.widget.AppCompatTextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="left|center_vertical"
        android:text="@string/ko_name"
        android:textColor="@color/colorWhite"
        android:singleLine="true"
        android:textStyle="bold"
        app:scale_height="50"
        app:scale_left="225"
        app:scale_top="10"
        app:scale_width="225"
        app:scale_textsize="35"/>

    <android.support.v7.widget.AppCompatTextView
        android:id="@+id/date"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="right|center"
        android:text="@string/dateNday"
        android:textColor="@color/colorGray"
        android:singleLine="true"
        app:scale_height="50"
        app:scale_left="450"
        app:scale_top="10"
        app:scale_width="140"
        app:scale_textsize="15" />

    <android.support.v7.widget.AppCompatTextView
        android:id="@+id/content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="left"
        android:maxLines="3"
        android:text="@string/content"
        android:textColor="@color/colorWhite"
        app:scale_height="80"
        app:scale_left="225"
        app:scale_top="70"
        app:scale_width="367"
        app:scale_textsize="20"
        app:textview_wrapcontent_resizesurrounded="true"
        app:textview_wrapcontent_direction="bottom"
        app:textview_wrapcontent_movesiblings="true"
        />

    <android.support.v7.widget.AppCompatTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:id="@+id/accept"
        android:singleLine="true"
        android:textColor="@color/colorWhite"
        android:text="@string/accept"
        android:background="@drawable/red_btn"
        app:scale_height="40"
        app:scale_left="255"
        app:scale_top="155"
        app:scale_width="80"
        app:scale_textsize="23"/>

    <android.support.v7.widget.AppCompatTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:id="@+id/reject"
        android:singleLine="true"
        android:textColor="@color/colorWhite"
        android:text="@string/reject"
        android:background="@drawable/red_line_btn"
        app:scale_height="40"
        app:scale_left="340"
        app:scale_top="155"
        app:scale_width="80"
        app:scale_textsize="23"/>

    <android.support.v7.widget.AppCompatTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:id="@+id/detail"
        android:singleLine="true"
        android:textColor="@color/colorWhite"
        android:text="@string/detail"
        android:background="@drawable/gray_btn"
        app:scale_height="40"
        app:scale_left="425"
        app:scale_top="155"
        app:scale_width="80"
        app:scale_textsize="23"/>

    <android.support.v7.widget.AppCompatTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:id="@+id/resend"
        android:singleLine="true"
        android:textColor="@color/colorWhite"
        android:text="@string/resend"
        android:background="@drawable/gray_line_btn"
        app:scale_height="40"
        app:scale_left="510"
        app:scale_top="155"
        app:scale_width="80"
        app:scale_textsize="23"/>

    <android.support.v7.widget.AppCompatTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:id="@+id/info"
        android:singleLine="true"
        android:textColor="@color/colorGray"
        android:text="@string/info_text"
        app:scale_height="40"
        app:scale_left="10"
        app:scale_top="200"
        app:scale_width="580"
        app:scale_textsize="20"/>

</com.ssomai.android.scalablelayout.ScalableLayout>

</android.support.v7.widget.LinearLayoutCompat>

Item의 코드는 다음과 같고, content 라는 아이디를 가진 TextView에서

app:textview_wrapcontent_resizesurrounded="true" app:textview_wrapcontent_direction="bottom" app:textview_wrapcontent_movesiblings="true"

세가지를 쓰면서 하단으로 동적으로 늘려주려 했습니다만, 3줄까지 출력되는 것이 있고, 1줄만 나오고 텍스트가 끊어질 때도 있습니다. (리스트 뷰가 20개를 로드하면, 4~5개는 잘려서 나옵니다)

혹시 해당사항의 구현에 제가 실수한 부분인지 여쭙고 싶습니다. 감사합니다.

ssomai commented 6 years ago

안녕하세요~ 샘플소스까지 자세히 올려주셔서 감사합니다~ 구현에 실수하신 부분은 없으신것 같습니다~.

textview setText 이후에 (ScalableLayout instance).requestLayout(); (ScalableLayout instance).forceLayout(); 한번 호출해보시겠어요~?

소스 172Line에서 확인하실수 있듯이 TextView에는 TextWatcher를 달았었는데 AppCompatTextView의 경우를 대응하지 못 한것 같네요. 알려주셔서 감사합니다~. 저도 테스트해보고 소스 업데이트 하겠습니다~ ㅎ

koocci commented 6 years ago

답변 감사합니다. ListView Custom Adapter 내에서 GetView 함수에 ViewHolder에 저장된 ScalableLayout instance에 return 하면서 말씀하신 호출을 적용해 보았습니다만 상황은 이전과 똑같은것 같습니다.

public class CustomAdapter extends ArrayAdapter{

...

@NonNull @Override public View getView(int position, View convertView, ViewGroup parent) { ... rootView = inflater.inflate(R.layout.content_my_item, parent, false); viewHolder.sl = (ScalableLayout) rootView.findViewById(R.id.sl); viewHolder.content = (TextView) rootView.findViewById(R.id.content);

...

viewHolder.content.setText(myItem.content);

...

viewHolder.sl.requestLayout();
viewHolder.sl.forceLayout();
return rootView;
}

...

}

다른 방향으로 해결할 방법이 있을까요? 감사합니다.

ssomai commented 6 years ago

흠~ 그럼 handler postDelayed를 이용해서 setText 후 100ms 뒤에 requestLayout, forceLayout 실행 한번 해봐주시겠어요?