অ্যান্ড্রয়েড: কেন দেখার জন্য কোনও ম্যাক্সহাইট নেই?


184

দেখুন এর একটি আছেminHeight তবে একরকম একটির অভাব রয়েছে maxHeight:

আমি যা অর্জন করতে চাইছি তা হ'ল কিছু আইটেম (ভিউ) পূরণ করা a ScrollView। যখন ১.৩ আইটেম রয়েছে তখন আমি সেগুলি সরাসরি প্রদর্শন করতে চাই। অর্থ ScrollView1 বা 2 বা 3 আইটেমের উচ্চতা রয়েছে।

যখন 4 বা ততোধিক আইটেম থাকে তখন আমি ScrollViewপ্রসারিত হওয়া বন্ধ করতে চাই (এভাবে ক maxHeight) এবং স্ক্রোলিং সরবরাহ শুরু করি।

তবে দুর্ভাগ্যক্রমে এটি সেট করার কোনও উপায় নেই maxHeight। সুতরাং আমি সম্ভবত আমার ScrollViewউচ্চতাটি প্রোগ্রামিমেটিকভাবে সেট করতে হবে WRAP_CONTENTযখন হয় 1..3 আইটেম থাকে এবং 3*sizeOf(View)যখন 4 বা ততোধিক আইটেম থাকে তখন উচ্চতা সেট করতে হয়।

maxHeightইতিমধ্যে একটি যখন সেখানে কেন সরবরাহ করা হয়নি কেন কেউ ব্যাখ্যা করতে পারেন minHeight?

(BTW: কিছু মতামত, মত ImageViewএকটি আছে maxHeightবাস্তবায়িত।)


: আমি অন্য থ্রেড একটি সমাধান পোস্ট করেছেন stackoverflow.com/questions/18425758/...
JMPergar

2
আমি এর জন্য একটি সমাধান তৈরি করেছি চিনতানড়োড.কম-এ
চিন্তন

গুগল সরিয়ে ম্যাক্সহাইট বিরক্তিকর এবং অসুবিধাজনক। একই ফলাফল পেতে এখন আপনাকে যা করতে হবে তা সমস্ত জিনিস দেখুন।
ইয়ান ওয়াম্বাই

উত্তর:


86

এইগুলির সমাধানগুলির মধ্যে আমার প্রয়োজন মতো কোনটিই কাজ করে নি যা একটি স্ক্রোলভিউ ছিল যা মোড়ানো_কন্টেন্টে সেট করা ছিল তবে ম্যাক্সহাইট ছিল যাতে এটি নির্দিষ্ট পয়েন্টের পরে প্রসারিত হওয়া বন্ধ করে স্ক্রোলিং শুরু করে। আমি কেবল স্ক্রোলভিউতে অন-মেজার পদ্ধতিটি ওভাররড করেছি।

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    heightMeasureSpec = MeasureSpec.makeMeasureSpec(300, MeasureSpec.AT_MOST);
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

এটি সমস্ত পরিস্থিতিতে কাজ নাও করতে পারে তবে এটি অবশ্যই আমার লেআউটের জন্য প্রয়োজনীয় ফলাফল দেয়। এবং এটি মধু দ্বারা মন্তব্যকে সম্বোধন করে।

যদি স্ক্রোলভিউয়ের নীচে কিছু লেআউট উপস্থিত থাকে তবে এই কৌশলটি কাজ করবে না - মধু 5 মার্চ 4:36 এ


1
কখন এই কাজ করবে না? এটি একটি খুব পরিষ্কার সমাধান মত মনে হচ্ছে। তারা কেন এটি এক্সএমএলে বাস্তবায়ন করেনি তা আমাকে অবাক করে দেয়।
ক্রিস্টোফ স্মেট

1
আপনি যদি 240 বলার জন্য ম্যানুয়ালি উচ্চতা সেট করেন তবে এটি কাজ করবে না the স্ক্রোলভিউটি যে মোডে রয়েছে তা মোডটি পরীক্ষা করতে আমি বিরক্ত করিনি কারণ আমার কেবলমাত্র 1 নির্দিষ্ট মোড (র‌্যাপ_কন্টেন্ট) সমর্থন করা দরকার।
হুইজল

এই উত্তরের জন্য একটি সম্পাদনা রয়েছে যা বলে যে 'যদি স্ক্রলভিউয়ের নীচে কিছু লেআউট উপস্থিত থাকে তবে এই কৌশলটি কাজ করবে না', যা সত্য নয়। আমার পৃষ্ঠার নীচে এক বিন্যাস প্রান্তিক করা আছে এবং এই কাস্টম লেআউটে "অ্যান্ড্রয়েড: লেআউট_আবিও = '@ + ...'" রয়েছে যা সর্বদা কাস্টম লেআউটটিকে নীচের লেআউটের উপরে রাখে :)
মেশিন ট্রাইব

70

একটি ম্যাক্সহাইট তৈরি করতে ScrollViewবা ListViewআপনাকে সর্বোচ্চ সর্বোচ্চ উচ্চতা কী হতে চায় তার উচ্চতার সাথে চারপাশে একটি স্বচ্ছ লিনিয়ারলআউট তৈরি করতে হবে। তারপরে আপনি স্ক্রোলভিউয়ের উচ্চতা সেট করেছেন wrap_content। এটি এমন একটি স্ক্রোলভিউ তৈরি করে যা এর উচ্চতা পৈতৃক লিনিয়ারলআউটের সমান না হওয়া অবধি বেড়ে যায়।


3
স্ক্রোলের সামগ্রীগুলি স্ক্রিনের পুরো উচ্চতায় প্রসারিত হওয়া থেকে রোধ করার জন্য এটি দরকারী।
কাইল আইভে

ছোট পরামর্শটি হ'ল লিনিয়ারলআউটের পরিবর্তে ফ্রেমলআউট ব্যবহার করা হবে তবে আমি সন্দেহ করি এটি গুরুত্বপূর্ণ matters
কাইল আইভে


2
আপনি কিছু কোড প্রদান করতে পারেন? এটি আমার পক্ষে কার্যকর হয়নি, তাই সম্ভবত আমি কিছু ভুল করছি ...
অ্যান্ড্রয়েড বিকাশকারী

আপনার নীচে বোতাম থাকলে কাজ করবে না। এটি বোতামগুলি স্ক্রিনের বাইরে ধাক্কা দেবে
লি তিয়ান গং

43

এটি এক্সএমএলে এটি অনুকূলিতকরণযোগ্য করার জন্য আমার পক্ষে কাজ করেছে:

MaxHeightScrollView.java:

public class MaxHeightScrollView extends ScrollView {

private int maxHeight;
private final int defaultHeight = 200;

public MaxHeightScrollView(Context context) {
    super(context);
}

public MaxHeightScrollView(Context context, AttributeSet attrs) {
    super(context, attrs);
    if (!isInEditMode()) {
        init(context, attrs);
    }
}

public MaxHeightScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    if (!isInEditMode()) {
        init(context, attrs);
    }
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public MaxHeightScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
    if (!isInEditMode()) {
        init(context, attrs);
    }
}

private void init(Context context, AttributeSet attrs) {
    if (attrs != null) {
        TypedArray styledAttrs = context.obtainStyledAttributes(attrs, R.styleable.MaxHeightScrollView);
        //200 is a defualt value
        maxHeight = styledAttrs.getDimensionPixelSize(R.styleable.MaxHeightScrollView_maxHeight, defaultHeight);

        styledAttrs.recycle();
    }
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST);
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}

attr.xml

<declare-styleable name="MaxHeightScrollView">
        <attr name="maxHeight" format="dimension" />
    </declare-styleable>

উদাহরণ লেআউট

<blah.blah.MaxHeightScrollView android:layout_weight="1"
                app:maxHeight="90dp"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content">
                <EditText android:id="@+id/commentField"
                    android:hint="Say Something"
                    android:background="#FFFFFF"
                    android:paddingLeft="8dp"
                    android:paddingRight="8dp"
                    android:gravity="center_vertical"
                    android:maxLines="500"
                    android:minHeight="36dp"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content" />
            </blah.blah.MaxHeightScrollView>

একটি কাস্টম ভিউ তৈরি করা অবশ্যই এটি অর্জনের সেরা উপায়।
বার্ট্রাম গিলফয়েলে

এবং যদি আপনার স্ক্রোল ভিউয়ের নিচে লেআউট থাকে তবে এটি কাজ করে! পারফেক্ট!
রাগাইসিস

25

(আমি জানি এটি সরাসরি প্রশ্নের উত্তর দেয় না তবে ম্যাক হাইট কার্যকারিতা সন্ধানকারী অন্যদের পক্ষে সহায়ক হতে পারে)

কনস্ট্রেন্টলয়েট তার বাচ্চাদের জন্য সর্বোচ্চ উচ্চতার প্রস্তাব দেয়

app:layout_constraintHeight_max="300dp"
app:layout_constrainedHeight="true" 

অথবা

app:layout_constraintWidth_max="300dp"
app:layout_constrainedWidth="true" 

নমুনা ব্যবহার এখানে


2
দর্শনটি উল্লম্ব চেইনে থাকলে এটি কাজ করে না (কনস্ট্রেন্টলয়েট
ডক্সে

তথ্যের জন্য ধন্যবাদ।
ব্যবহারকারী1506104

8

আমি পারলে হুইসেলের জবাব সম্পর্কে মন্তব্য করতে পারতাম, তবে এটিকে নোট করা কার্যকর মনে হয়েছে যে অ্যান্ড্রয়েড এন-তে মাল্টি-উইন্ডো মোডের প্রসঙ্গে এই সমস্যাটি সমাধান করার জন্য আমাকে কোডটি কিছুটা এই পরিবর্তন করতে হবে:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    if(MeasureSpec.getSize(heightMeasureSpec) > maxHeight) {
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST);
    }
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

এটি সর্বাধিক উচ্চতার চেয়ে ছোট আকারের বিন্যাসটিকে মাপ দেয়, তবে এটি সর্বোচ্চ উচ্চতার চেয়ে বড় হতে বাধা দেয়। আমি এটি একটি লেআউট শ্রেণি ব্যবহার করেছি যা ওভাররাইড করে RelativeLayoutএবং এটি আমাকে ScrollViewসন্তানের সাথে একটি কাস্টম সংলাপ তৈরি MaxHeightRelativeLayoutকরতে দেয় যা এর স্ক্রিনের পুরো উচ্চতাকে প্রসারিত করে না এবং অ্যান্ড্রয়েডের জন্য বহু-উইন্ডোতে ক্ষুদ্রতম বিধবা আকারের মধ্যে ফিট করার জন্য সঙ্কুচিতও হয় এন


4

ম্যাক্সহাইট সেট করার কোনও উপায় নেই। তবে আপনি উচ্চতা নির্ধারণ করতে পারেন।

এটি করতে আপনাকে প্রতিটি স্ক্রোলভিউয়ের আইটেমের উচ্চতা আবিষ্কার করতে হবে। এরপরে আপনার স্ক্রোলভিউ উচ্চতাটি নাম্বারফিন্স * উচ্চতাফট আইটেমটিতে সেট করুন।

কোনও আইটেমের উচ্চতা আবিষ্কার করতে এটি করুন:

View item = adapter.getView(0, null, scrollView);
item.measure(0, 0);
int heightOfItem = item.getMeasuredHeight();

উচ্চতা নির্ধারণ করতে এটি করুন:

// if the scrollView already has a layoutParams:
scrollView.getLayoutParams().height = heightOfItem * numberOfItens;
// or
// if the layoutParams is null, then create a new one.
scrollView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, heightOfItem * numberOfItens));

4

আপনার সমতলকে ScrollViewআপনার LinearLayoutলেআউট_হাইট = "সর্বাধিক উচ্চতা" দিয়ে মুড়ে দিন, এটি একটি নিখুঁত কাজ করবে। আসলে, আমার শূন্য ইস্যু সহ গত 5 বছর থেকে এই কোডটি উত্পাদন করছে।

<LinearLayout
        android:id="@+id/subsParent"
        android:layout_width="match_parent"
        android:layout_height="150dp"
        android:gravity="bottom|center_horizontal"
        android:orientation="vertical">

        <ScrollView
            android:id="@+id/subsScroll"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:layout_marginEnd="15dp"
            android:layout_marginStart="15dp">

            <TextView
                android:id="@+id/subsTv"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/longText"
                android:visibility="visible" />

        </ScrollView>
    </LinearLayout>

1
নিখুঁত সমাধান। চতুর এবং সহজ। এটি এমনকি পুনর্ব্যবহারযোগ্য জন্য উপযুক্ত।
অ্যালেক্স বিলেটস

3

আমার MaxHeightScrollViewকাস্টম ভিউ

public class MaxHeightScrollView extends ScrollView {
    private int maxHeight;

    public MaxHeightScrollView(Context context) {
        this(context, null);
    }

    public MaxHeightScrollView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public MaxHeightScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }

    private void init(Context context, AttributeSet attrs) {
        TypedArray styledAttrs =
                context.obtainStyledAttributes(attrs, R.styleable.MaxHeightScrollView);
        try {
            maxHeight = styledAttrs.getDimensionPixelSize(R.styleable.MaxHeightScrollView_mhs_maxHeight, 0);
        } finally {
            styledAttrs.recycle();
        }
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if (maxHeight > 0) {
            heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST);
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

style.xml

<declare-styleable name="MaxHeightScrollView">
    <attr name="mhs_maxHeight" format="dimension" />
</declare-styleable>

ব্যবহার

<....MaxHeightScrollView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:mhs_maxHeight="100dp"
    >

    ...

</....MaxHeightScrollView>

2

আমার এখানে একটি উত্তর আছে:

https://stackoverflow.com/a/29178364/1148784

স্ক্রোলভিউকে প্রসারিত করে একটি নতুন ক্লাস তৈরি করুন এবং এর onMeasureপদ্ধতিটি ওভাররাইড করুন ।

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if (maxHeight > 0){
            int hSize = MeasureSpec.getSize(heightMeasureSpec);
            int hMode = MeasureSpec.getMode(heightMeasureSpec);

            switch (hMode){
                case MeasureSpec.AT_MOST:
                    heightMeasureSpec = MeasureSpec.makeMeasureSpec(Math.min(hSize, maxHeight), MeasureSpec.AT_MOST);
                    break;
                case MeasureSpec.UNSPECIFIED:
                    heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST);
                    break;
                case MeasureSpec.EXACTLY:
                    heightMeasureSpec = MeasureSpec.makeMeasureSpec(Math.min(hSize, maxHeight), MeasureSpec.EXACTLY);
                    break;
            }
        }

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

2

উপরে উল্লিখিত হিসাবে, কনস্ট্র্যান্টলআউট তার বাচ্চাদের জন্য সর্বোচ্চ উচ্চতার মাধ্যমে এর মাধ্যমে প্রস্তাব করে:

app:layout_constraintHeight_max="300dp"
app:layout_constrainedHeight="true"

এছাড়াও, যদি কোনও কনস্ট্রেন্টলআউটয়ের সন্তানের সর্বোচ্চ উচ্চতা অ্যাপ চলমান অবধি অনিশ্চিত হয় তবে এখনও এই শিশুটিকে উল্লম্ব চেইনে যেখানেই রাখা হয়েছিল তা বিবেচনা না করে এই শিশুটিকে স্বয়ংক্রিয়ভাবে একটি পরিবর্তনীয় উচ্চতা মানিয়ে নেওয়ার একটি উপায় রয়েছে।

উদাহরণস্বরূপ, আমাদের একটি পরিবর্তনীয় শিরোনাম টেক্সটভিউ, একটি পরিবর্তনীয় স্ক্রোলভিউ এবং একটি পরিবর্তনীয় পাদচরণ টেক্সটভিউয়ের সাথে একটি নীচের ডায়লগটি দেখাতে হবে। কথোপকথনের সর্বাধিক উচ্চতা 320dp total যখন সম্পূর্ণ উচ্চতা 320dp স্ক্রোলভিউতে না পৌঁছায় তখন মোড়ক_কন্টেন্ট হিসাবে কাজ করে, যখন সম্পূর্ণ উচ্চতা স্ক্রোলভিউকে "ম্যাক্সহাইট = 320 ডিপি - শিরোনামের উচ্চতা - পাদদেশের উচ্চতা" হিসাবে অতিক্রম করে।

আমরা কেবল এক্সএমএল লেআউট ফাইলের মাধ্যমে এটি অর্জন করতে পারি:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="320dp">

    <TextView
        android:id="@+id/tv_header"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/black_10"
        android:gravity="center"
        android:padding="10dp"
        app:layout_constraintBottom_toTopOf="@id/scroll_view"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="1"
        app:layout_constraintVertical_chainStyle="packed"
        tools:text="header" />

    <ScrollView
        android:id="@+id/scroll_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/black_30"
        app:layout_constrainedHeight="true"
        app:layout_constraintBottom_toTopOf="@id/tv_footer"
        app:layout_constraintHeight_max="300dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/tv_header">

        <LinearLayout
            android:id="@+id/ll_container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <TextView
                android:id="@+id/tv_sub1"
                android:layout_width="match_parent"
                android:layout_height="160dp"
                android:gravity="center"
                android:textColor="@color/orange_light"
                tools:text="sub1" />

            <TextView
                android:id="@+id/tv_sub2"
                android:layout_width="match_parent"
                android:layout_height="160dp"
                android:gravity="center"
                android:textColor="@color/orange_light"
                tools:text="sub2" />

        </LinearLayout>
    </ScrollView>

    <TextView
        android:id="@+id/tv_footer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/black_50"
        android:gravity="center"
        android:padding="10dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/scroll_view"
        tools:text="footer" />
</android.support.constraint.ConstraintLayout>

সর্বাধিক আমদানি কোডটি সংক্ষিপ্ত:

app:layout_constraintVertical_bias="1"
app:layout_constraintVertical_chainStyle="packed"

app:layout_constrainedHeight="true"

অনুভূমিক ম্যাক্সউইথের ব্যবহার একরকম।


1

আপনি কি লেআউট_ ওয়েটের মানটি ব্যবহার করে চেষ্টা করেছেন ? ? যদি আপনি এটি 0 টির চেয়ে বড় একটি মানতে সেট করেন তবে এটি সেই দৃশ্যটি উপলব্ধ উপলব্ধ স্থানের মধ্যে প্রসারিত করবে।

যদি আপনার একাধিক মতামত থাকে যা প্রসারিত করার দরকার হয়, তবে মানটি তাদের মধ্যে ওজন হয়ে উঠবে।

সুতরাং আপনার যদি দুটি মতামত যদি একটি লেআউট_ ওয়েটের মান 1 সেট করে থাকে তবে তারা উভয়ই স্থান পূরণ করতে প্রসারিত করবে তবে তারা উভয়ই সমান পরিমাণে প্রসারিত করবে। আপনি যদি তাদের মধ্যে একটির 2 টির মান নির্ধারণ করেন তবে এটি অন্য দেখার চেয়ে দ্বিগুণ প্রসারিত হবে।

লিনিয়ার লেআউটের অধীনে এখানে আরও কিছু তথ্য তালিকাভুক্ত করা হয়েছে।


1
ওজন নিয়ে সমস্যা হ'ল তারা আপেক্ষিক। বিভিন্ন স্ক্রিনের আকার, বিভিন্ন ফলাফল, উদাহরণস্বরূপ, 800px স্ক্রিনের সাহায্যে আমি একটি নির্দিষ্ট মানকে ওজন নির্ধারণ করতে পারি, যাতে একটি নির্দিষ্ট অঞ্চলটি কাঙ্ক্ষিত 200px দিয়ে শেষ হয়। যাইহোক, 850px স্ক্রিনের সাহায্যে নির্দিষ্ট ক্ষেত্রটি 200px এর চেয়ে বড় হতে পারে তবে সংযুক্ত উপাদানগুলি এখনও 200 পেক্স। সে কারণেই আমি এমন একটিটিকে পছন্দ করলাম maxHeightযা আমি একটি নির্দিষ্ট ডিপ মানতে সেট করতে পারি। (আমি শেষ পর্যন্ত গণনা এবং প্রোগ্রামটিমে উচ্চতা সেট করতে শেষ করেছি)
znq

1

আমি তোমার মাত্র 1 আইটেমের জন্য রানটাইম এ heiht সেট করতে পারেন scrollView.setHeight(200px)2 আইটেম জন্য, scrollView.setheight(400px)3 বা আরো জন্যscrollView.setHeight(600px)


8
আপনি 'px' তে মাত্রা নির্ধারণ করতে চান না। এটি সম্ভবত একাধিক ডিভাইসে আপনি যে ফলাফলটি চান তা পেতে চান না very বিকাশকারী.অ্যান্ড্রয়েড
গাইড / টপিক্স

@ হার্ডডারবেল্ড কোডটিতে এটিই কাজ করে। আপনি যদি চান, আপনি সর্বদা ডিপি থেকে পিক্সেলকে খুব সহজেই রূপান্তর করতে পারবেন: ফ্লোট পিক্সেল = টাইপডভ্যালিউ.এপ্লিডাইমেনশন (টাইপডভ্যালিউ.কম্প্লেক্স_ইউআইআইডিপি, ডিপি, কনটেক্সট.জেট রিসোর্স () .getDisplayMetrics ());
অ্যান্ড্রয়েড বিকাশকারী

1

আমরা জানি যে অ্যান্ড্রয়েড চলমান ডিভাইসের বিভিন্ন স্ক্রিনের আকার থাকতে পারে। আমরা আরও জানি যে মতামতগুলি গতিশীলভাবে সামঞ্জস্য করা উচিত এবং উপযুক্ত স্থান হওয়া উচিত।

আপনি যদি সর্বোচ্চ উচ্চতা নির্ধারণ করেন তবে আপনি সম্ভবত দৃশ্যের জন্য পর্যাপ্ত জায়গা না পেয়ে বা কম স্থান না নিয়ে যেতে বাধ্য করুন। আমি জানি যে কখনও কখনও এটি সর্বাধিক উচ্চতা নির্ধারণ করা ব্যবহারিকভাবে বলে মনে হয়। তবে যদি রেজোলিউশনটি কখনও নাটকীয়ভাবে পরিবর্তিত হয় এবং তা হয়ে যায় !, তাহলে সর্বাধিক উচ্চতাযুক্ত দর্শনটি উপযুক্ত মনে হবে না।

আমি মনে করি আপনি যে লেআউটটি চান তা ঠিকঠাক করার কোনও সঠিক উপায় নেই। আমি আপনাকে লেআউট পরিচালক এবং আপেক্ষিক প্রক্রিয়া ব্যবহার করে আপনার বিন্যাসের বিষয়ে চিন্তা করার পরামর্শ দিচ্ছি। আপনি কী অর্জন করতে চাইছেন তা আমি জানি না তবে এটি আমার কাছে কিছুটা অদ্ভুত লাগছে যে তালিকার মধ্যে কেবল তিনটি আইটেম প্রদর্শিত হবে এবং তারপরে ব্যবহারকারীকে স্ক্রোল করতে হবে।

BTW। মিনিটের উচ্চতা গ্যারান্টিযুক্ত নয় (এবং সম্ভবত এটির উপস্থিতি নেই)। আইটেমগুলি দৃশ্যমান হতে বাধ্য করার ক্ষেত্রে এর কিছু উপকার থাকতে পারে এবং অন্যান্য আপেক্ষিক আইটেমগুলি ছোট হয়ে যায়।


6
এটা ভুল. এই যুক্তি দ্বারা, আপনি অ্যান্ড্রয়েড বলতে পারবেন না: লেআউট_উইথ = "500 ডিপি", হয়ও।
গ্লেন মেইনার্ড

আপনার যৌক্তিক ব্যাখ্যার ত্রুটি বা ত্রুটিযুক্ত হওয়া উচিত তা আমি দেখতে পাচ্ছি না। আপনি যদি বিন্যাস_পরিধি সেট করেন (যা কখনও কখনও ঠিক থাকে), এটি নিশ্চিত হওয়ার নিশ্চয়তা নেই that 500 ডিপি সম্ভবত একটি ডিভাইস উপযুক্ত দেখায়, অন্যটি নয়। লেআউট ম্যানেজাররা এফটিডব্লিউ! হয়ত আপনি আরও
বিসিএসকে

3
অ্যান্ড্রয়েড বলতে যেমন ঠিক বৈধ: ম্যাক্সউইডথ = "500 ডিপি" অ্যান্ড্রয়েড বলতে: লেআউট_উইথ = "500 ডিপি"। তারা উভয় দৃশ্যে নির্দিষ্ট মাত্রা জোর করে।
গ্লেন মেইনার্ড

1

যদি কেউ লেআউটপ্যারামগুলির জন্য যথাযথ মানটি বিবেচনা করে থাকে তবে

setLayoutParams(new LayoutParams(Y, X );

ডিভাইস প্রদর্শনের ঘনত্বটি বিবেচনায় রাখার কথা মনে রাখবেন অন্যথায় আপনি বিভিন্ন ডিভাইসে খুব অদ্ভুত আচরণ পেতে পারেন। উদাহরণ:

Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics d = new DisplayMetrics();
display.getMetrics(d);
setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, (int)(50*d.density) ));

0

প্রথমে পিক্সেলগুলিতে আইটেমের উচ্চতা পান

View rowItem = adapter.getView(0, null, scrollView);   
rowItem.measure(0, 0);    
int heightOfItem = rowItem.getMeasuredHeight();

তারপর সহজভাবে

Display display = getWindowManager().getDefaultDisplay();    
DisplayMetrics displayMetrics = new DisplayMetrics();    
display.getMetrics(displayMetrics);    
scrollView.getLayoutParams().height = (int)((heightOfItem * 3)*displayMetrics .density);

0

যদি আপনি ছেলেরা একটি অ-ওভারফ্লো স্ক্রোলভিউ বা তালিকার ভিউ তৈরি করতে চান তবে কেবল এটির উপরে এবং নীচে শীর্ষস্থান এবং নীচে পর্যালোচনা সহ একটি রিলেটিভলয়েউটে:

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_above="@+id/topview"
    android:layout_below="@+id/bottomview" >

এর জন্য আরও ক্রেডিট দরকার। নির্দিষ্ট তবে সাধারণ বাস্তবায়ন।
লুক অ্যালিসন

0

আমি কোটলিনে তৈরি একটি কাস্টম স্ক্রোলভিউ ব্যবহার করেছি যা ব্যবহার করে maxHeight। ব্যবহারের উদাহরণ:

<com.antena3.atresplayer.tv.ui.widget.ScrollViewWithMaxHeight
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:maxHeight="100dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
</com.antena3.atresplayer.tv.ui.widget.ScrollViewWithMaxHeight>

এখানে কোড ScrollViewWidthMaxHeight:

import android.content.Context
import android.util.AttributeSet
import android.widget.ScrollView
import timber.log.Timber

class ScrollViewWithMaxHeight @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : ScrollView(context, attrs, defStyleAttr) {

companion object {
    var WITHOUT_MAX_HEIGHT_VALUE = -1
}

private var maxHeight = WITHOUT_MAX_HEIGHT_VALUE

init {
    val a = context.obtainStyledAttributes(
        attrs, R.styleable.ScrollViewWithMaxHeight,
        defStyleAttr, 0
    )
    try {
        maxHeight = a.getDimension(
            R.styleable.ScrollViewWithMaxHeight_android_maxHeight,
            WITHOUT_MAX_HEIGHT_VALUE.toFloat()
        ).toInt()
    } finally {
        a.recycle()
    }
}

override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
    var heightMeasure = heightMeasureSpec
    try {
        var heightSize = MeasureSpec.getSize(heightMeasureSpec)
        if (maxHeight != WITHOUT_MAX_HEIGHT_VALUE) {
            heightSize = maxHeight
            heightMeasure = MeasureSpec.makeMeasureSpec(heightSize, MeasureSpec.AT_MOST)
        } else {
            heightMeasure = MeasureSpec.makeMeasureSpec(heightSize, MeasureSpec.UNSPECIFIED)
        }
        layoutParams.height = heightSize
    } catch (e: Exception) {
        Timber.e(e, "Error forcing height")
    } finally {
        super.onMeasure(widthMeasureSpec, heightMeasure)
    }
}

fun setMaxHeight(maxHeight: Int) {
    this.maxHeight = maxHeight
}
}

যার এই ঘোষণাতেও দরকার values/attrs.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ScrollViewWithMaxHeight">
        <attr name="android:maxHeight" />
    </declare-styleable>
</resources>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.