অ্যান্ড্রয়েডে অন্য দর্শনের উপরে একটি ভিউ স্থাপন / ওভারল্যাপিং (জেড-ইনডেক্স)


229

আমার একটি লিনিয়ার লেআউট রয়েছে যা ইমেজভিউ এবং পাঠ্যদর্শন নিয়ে থাকে, একের নীচে লিনিয়ার বিন্যাসে থাকে।

<LinearLayout android:orientation="horizontal" ... >
 <ImageView 
     android:id="@+id/thumbnail"
     android:layout_weight="0.8" 
     android:layout_width="0dip"
     android:layout_height="fill_parent">
 </ImageView>
 <TextView 
    android:id="@+id/description"
    android:layout_weight="0.2"
    android:layout_width="0dip"
    android:layout_height="wrap_content">
 </TextView>

কিছু নিয়ম অনুপস্থিত হতে পারে, এটি একটি ধারণা দেওয়ার জন্য, লেআউটটি কেমন দেখাচ্ছে। আমি আরও একটি ছোট টেক্সট ভিউ চাই 50 ডিপ দৈর্ঘ্য এবং প্রস্থে, ইমেজভিউয়ের উপরে স্থাপন করেছি, "ওভার" দ্বারা, আমি ইমেজভিউয়ের চেয়ে জেড-ইনডেক্সকে বেশি বোঝাতে চাই, আমি এটি কেন্দ্রের এবং উপরে (ওভারল্যাপিং) চিত্রের ভিউতে রাখতে চাই।

আমি জানতে চাই কীভাবে আমরা ভিন্ন ভিন্ন জেড-ইনডেক্সের সাথে একাধিকের উপরে একটি ভিউ রাখতে পারি (পছন্দসই রৈখিক বিন্যাসে)?

উত্তর:


294

আপনি এটির জন্য লিনিয়ারলআউট ব্যবহার করতে পারবেন না তবে আপনি এটি ব্যবহার করতে পারেন FrameLayout। একটি FrameLayout, Z-সূচক যা আইটেম উদাহরণস্বরূপ যোগ করা হয়, যাতে দ্বারা সংজ্ঞায়িত হয়:

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    >
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/my_drawable"
        android:scaleType="fitCenter"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|center"
        android:padding="5dp"
        android:text="My Label"
        />
</FrameLayout>

এই উদাহরণে, টেক্সটভিউটি চিত্রের নীচের অংশটি বরাবর ইমেজভিউয়ের শীর্ষে আঁকা হবে।


হ্যাঁ আমি ডকুমেন্টেশনের পরে ফ্রেম লেআউটটি ব্যবহার করে এটি করেছি। ধন্যবাদ.
বসে

11
এর জন্য রিলেটিভলআউট পরিবর্তে ফ্রেমলআউট ব্যবহার করার কোনও সুবিধা আছে কি?
আইএক্সএক্স

12
ফ্রেমলআউট গ্রুপের অন্যান্য মতামতের সাথে সম্পর্কিত নয়, এটি কেবল তাদের পিতামাতার ক্ষেত্রে স্তর দেয়। অন্যান্য আইটেমের তুলনায় রিলেটিভলআউট পজিশনের জন্য আরও বেশি।
কেভিন কপোকক

3
হাই কেসিপপক আমার মোবাইল (এইচডিপিআই) ফ্রেম লেআউটে জেড-অর্ডারকে সম্মান করে না, তবে আমার একটি অন্য (এক্সএইচডিপিআই) আছে এবং এই আদেশটি সম্মান করে, আপনি কি জানেন কেন এটি করেন? আগাম ধন্যবাদ! : ডি
মেরেলি এসকর্পেন্টার পেরেজ

1
এপিআই 21 / কিটকাট হিসাবে আপনি এখন সেটজেড এবং ট্রান্সলেশনজেড ব্যবহার করতে পারেন; ফ্রেমলআউট হ্যাকের আর দরকার নেই (শেষ পর্যন্ত!)। এই আধুনিক 5.0+ উন্নয়নের জন্য পছন্দের উত্তর হওয়া উচিত: stackoverflow.com/a/29703860/358578
pbarranis

183

চেষ্টা করে দেখুন .bringToFront():

http://developer.android.com/reference/android/view/View.html#bringToFront%28%29


3
আমরা কি এটি এক্সএমএল ফাইলগুলিতে ব্যবহার করতে পারি?
বিজ্ঞাপনগুলি

2
অনুবাদ অ্যানিমেশন চলাকালীন itz zindex পরিবর্তন করতে আমার দৃষ্টিভঙ্গি আনতে আমি এমন কিছু সন্ধান করছিলাম।
DeltaCap019

আপনি অনুবাদ অ্যানিমেশন জন্য একটি সমাধান খুঁজে পেতে পারেন?
এনআখমেডভ

9
চাইল্ডটোফ্রন্ট () কেবলমাত্র তার পিতামাতার ভিতরে ভিউয়ের সূচি পরিবর্তন করে
জার ই আহমের

4
এটি পুরো লেআউট অর্ডারটিকে স্ক্রু করে দেয়
জেমশিত ইস্কেন্দ্রভ

66

রিলেটিভলআউট একইভাবে কাজ করে, আপেক্ষিক বিন্যাসের শেষ চিত্রটি জয়লাভ করে।


14
আপনি যদি উচ্চতা ব্যবহার না করেন তবে আপনারও এর মধ্যে সবচেয়ে বড় মান প্রয়োজন।
সামি কুহমনেন

5
এই প্রশ্নটি উত্থাপনের আগেই জিজ্ঞাসা করা হয়েছিল এবং উত্তর দেওয়া হয়েছিল answered যদি আপনার অ্যাপ্লিকেশনটিতে ললিপপের চেয়ে মিনিএসডিকে কম থাকে তবে এলিভেশন ব্যবহার করে সমস্যার সমাধান হবে না (প্রি-ললিপপ ফোনে আপনি যদি কেবলমাত্র উচ্চতার উপরে নির্ভর করেন তবে লেআউটটি ভুল দেখায়) - আপনাকে এখনও লেআউটটির ক্রমের দিকে মনোযোগ দিতে হবে। যদিও আপনি ঠিক বলেছেন, আপনি যদি নীচের অংশে এলিভেশন ব্যবহার করেন - আপনার অবশ্যই অবশ্যই শীর্ষে কমপক্ষে একই বা উচ্চতর হওয়া দরকার।
jt-gilkeson

27

ড্র অর্ডার পরিবর্তন করা হচ্ছে

একটি বিকল্প হ'ল পিতা-মাতার দ্বারা দেখানো ক্রমটি পরিবর্তন করা। আপনি সেটগার্ড্রেনড্রয়িংআর্ডারএনেবলড (সত্য) কল করে এবং চাইল্ডড্রাউইং অর্ডার (ইন চাইল্ডকাউন্ট, ইন আই) ওভাররাইড করে এই বৈশিষ্ট্যটি ভিউগ্রুপ থেকে সক্ষম করতে পারেন ।

উদাহরণ:

/**
 * Example Layout that changes draw order of a FrameLayout
 */
public class OrderLayout extends FrameLayout {

    private static final int[][] DRAW_ORDERS = new int[][]{
            {0, 1, 2},
            {2, 1, 0},
            {1, 2, 0}
    };

    private int currentOrder;

    public OrderLayout(Context context) {
        super(context);
        setChildrenDrawingOrderEnabled(true);
    }

    public void setDrawOrder(int order) {
        currentOrder = order;
        invalidate();
    }

    @Override
    protected int getChildDrawingOrder(int childCount, int i) {
        return DRAW_ORDERS[currentOrder][i];
    }
}

আউটপুট:

OrderLayout#setDrawOrder(int)0-1-2 এর ফলাফলের সাথে কল করা :

এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন


আপনি কি ক্রিয়াকলাপের অনক্রিট () তে সেটড্রোর্ডার (i) কল করেন? আমার এক্সএমএলে যদি আমার কাছে 6 টি উইজেট থাকে তবে আমার কি DRAW_ORDERS এর প্রতিটি সারি 6 সংখ্যার অ্যারে (0-5) দিয়ে শুরু করার দরকার আছে?
জন ওয়ার্ড

@ জনওয়ার্ড উপরের দেখানো লেআউটটি কেবলমাত্র উদাহরণস্বরূপ, আপনি getChildDrawingOrder () এ নিজের আচরণটি নির্ধারণ করতে পারেন।
টব্রুন

এখানে অনেক স্পষ্ট কোড সম্পর্কিত সম্পর্কিত পোস্ট: stackoverflow.com/questions/20524162/framelayout-in-revers
রবার্ট

20

আপনি view.setZ(float)এপিআই স্তর 21 থেকে শুরু করে ব্যবহার করতে পারেন Here এখানে আপনি আরও তথ্য পেতে পারেন।


3
এটি এখন 21 / KitKat / 5.0 বা ততোধিকের জন্য পছন্দসই উত্তর হওয়া উচিত। পুরানো ফ্রেমলআউট হ্যাক শুকরিয়া আর প্রয়োজন নেই। ব্যক্তিগতভাবে আমি সেটজেড এবং ট্রান্সলেশনজেডের মধ্যে পার্থক্য বুঝতে পারি না, তবে পরবর্তীটি একটি বৈশিষ্ট্য এবং আমার জন্য সুন্দরভাবে কাজ করেছে। ধন্যবাদ!
pbarranis

পূর্ববর্তী এপিআইএসের জন্য আপনি ভিউকম্প্যাট # সেটজেড ()ও ব্যবহার করতে পারেন।
আলী ইউসেল আকগুল

@ অ্যালয়িউসেল অ্যাকগুল আপনি যদি এখানে ডক্সগুলি দেখেন, আপনি দেখতে পারেন Compatibility: API < 21: No-op । সুতরাং আমি মনে করি এটি কার্যকর হবে না
ভাদিম কোতোভ

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

@ অ্যালয়িউসেল অ্যাকগুল ভাল, এটি আশ্চর্যজনক। ডক্সে ভুল হতে পারে? আপনি কি 100% নিশ্চিত যে এটি << 21 এর জন্য কাজ করছে? আমার ধারণা আছে এটি পূর্ববর্তী এপিআইগুলির জন্য দর্শনের ক্রম পরিবর্তন করতে পারে তবে উত্থানের মতো কোনও অভিনব জিনিস নেই etc
ভাদিম কোতোভ

14

android:elevation="1dp"আপনি যে ভিউটি অন্যটিকে দেখতে চান তা যুক্ত করে আমি একই সমস্যার সমাধান করেছি । তবে এটি 5.0 এর নীচে প্রদর্শিত হতে পারে না এবং এর কিছুটা ছায়া থাকবে, আপনি যদি এটি গ্রহণ করতে পারেন তবে তা ঠিক।

সুতরাং, সবচেয়ে সঠিক সমাধান যা @kcoppock হয় বলেছে।


7

আপেক্ষিক লেআউটে এটি ব্যবহার করে দেখুন:

ImageView image = new ImageView(this);
image.SetZ(float z);

এটা আমার জন্য কাজ করে.


2
আপনার কিছুটা আরও ভাল করে ব্যাখ্যা করা উচিত। উদাহরণস্বরূপ আপনি এই কোডটি কোথায় রাখবেন?
দেববি

ভাল, আমি এটি অনক্রিয়েট () পদ্ধতিতে রেখেছি। যুক্ত প্রতিটি চিত্রের পূর্বে যুক্ত হওয়া চিত্রগুলির তুলনায় একটি z সূচক রয়েছে। আমি বলতে চাইছি, জেড ইনডেক্সের মাধ্যমে আমি আগেরটির পিছনের অংশের অবস্থানটি পরিবর্তন করতে পারি।
রিজো

5

লিনিয়ারলআউট ব্যবহার করার একটি উপায় রয়েছে। কেবলমাত্র আপনার পূর্ববর্তী উপাদানের মার্জিনটপটিকে সংশ্লিষ্ট negativeণাত্মক মান হিসাবে সেট করুন এবং নিশ্চিত করুন যে আপনি শীর্ষে যে উপাদানটি চান তা নীচে আপনার XML- এ থাকা উপাদানটির পরে রয়েছে।

<linearLayout android:orientation="horizontal" ... >
<ImageView 
 android:id="@+id/thumbnail"
 android:layout_weight="0.8" 
 android:layout_width="0dip"
 android:layout_height="fill_parent"
>
</ImageView>
<TextView 
android:id="@+id/description"
android:layout_marginTop="-20dip"
android:layout_weight="0.2"
android:layout_width="0dip"
android:layout_height="wrap_content"
>
</TextView>

4

আফাইক আপনি লিনিয়ার লেআউট দিয়ে এটি করতে পারবেন না, আপনাকে একটি রিলেটিভ লেআউট যেতে হবে ।


রিলেটিভলআউট ফ্রেমলয়আউট প্রসারিত করে না, আপনি কি নিশ্চিত যে এটি কাজ করবে?
একাটজ

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

এই পথে যাওয়ার উপায়
অ্যালবার্ট জেমস টেডি


0

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

containerView.bringChildToFront(topView);

কন্টেইনারভিউ হল দেখার মত ধারক বাছাই করা, টপভিউ এমন দৃশ্য যা আমি ধারক শীর্ষে শীর্ষে থাকতে চাই।

ব্যবস্থা করার জন্য একাধিক মতামতের জন্য উপরে উল্লিখিত হিসাবে সেটচিলড্রেনড্রয়িংআর্ডারএনেবল (সত্য) এবং ওভাররাইড গেটচিল্ড্রাউন্টিং অর্ডার (ইন চাইল্ডকাউন্ট, ইন আই) ব্যবহার করতে চলেছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.