সব কিছুর সামনে ভিউ আনব কীভাবে?


130

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

এখন বিষয়টি হ'ল আমি চাই বোতামগুলি সর্বদা সামনে থাকুক। এবং যখন পাঠ্যদর্শনটি সরানো হচ্ছে তখন আমি বোতামগুলির পিছনে যেতে চাই।

আমি এটি অর্জন করতে পারি না আমি নিজের যা কিছু জানি তার চেষ্টা করেছি এবং "bringToFront ()" সুনির্দিষ্টভাবে কাজ করে না।

দ্রষ্টব্য আমি জেড-অর্ডারটি নিয়ন্ত্রণ করতে চাই না যাতে উপাদানটি লেআউটে রাখার আদেশ দিয়ে আমি সহজেই পারি না :), লেআউটটি জটিল এবং আমি সমস্ত বোতাম লেআউটটির ভিক্ষায় রাখতে পারি না


3
আমি RelativeLayoutএক্সএমএলে সর্বশেষ প্রদর্শিত "শীর্ষ" ভিউ সহ একটি ব্যবহার করেছি । দেখুন stackoverflow.com/a/31340762/1121497
Ferran Maylinch

যে কেউ দয়া করে 'টিয়ারফ্রন্ট' এর এক্সএমএলে সংশ্লিষ্ট কোডটি বলতে পারবেন
শিরীশ হারওয়াড

আপনার এক্সএমএলে উন্নততা নীচে ভিউ = উচ্চতা: 1 ডিপি এবং শীর্ষভিউ = উচ্চতা: 2 ডিপি ব্যবহার করার চেষ্টা করুন || ViewCompat.setElevation (দেখুন, অভ্যন্তরীণ)
Tlacaelel রামন Luis

উত্তর:


144

আপনি সামনে আসতে চান এমন দৃশ্যে আপনি আনতে টুফ্রন্ট () কল করতে পারেন

এটি একটি উদাহরণ:

    yourView.bringToFront();

4
অপ্রত্যাশিত ফলাফল: আমি ব্যবহার করেছি যে একটি উল্লম্ব রৈখিক বিন্যাসে এবং সামনে এনে দেওয়া দৃশ্যটি নীচে উপস্থিত হয়েছিল ... উদাহরণস্বরূপ, আমার ছিল A / B / Cএবং Aসামনে আনতে চেয়েছিলাম , তাই দৌড়ানোর পরে a.bringToFront()আমি শেষের মতো লেআউটটি দিয়ে শেষ করেছি B / C / A
ফেরান মেলিনচ

2
সুতরাং আমি LinearLayoutব্যবহার করেছি ব্যবহার করা যাবে না bringToFront। আমি একটি ব্যবহার শেষ RelativeLayout। প্রশ্নে আমার মন্তব্য দেখুন।
ফেরান মেলিনচ

1
যে কেউ দয়া করে 'টিয়ারফ্রন্ট' এর এক্সএমএলে সংশ্লিষ্ট কোডটি বলতে পারবেন
শিরীশ হারওয়াদে

ফলস্বরূপ উপাদানটির পুনরায় অবস্থানের ফলস্বরূপ আমি যে কোনও কারণে সামনের দিকে যাচ্ছি। ViewCompat.setTranslationZ(view, 1)অন্যদিকে পুরোপুরি কাজ করে।
বিনমে

1
যদি আমি ম্যানিফেস্টে অ্যান্ড্রয়েড ব্যবহার করি: থিম = "@ অ্যান্ড্রয়েড: স্টাইল / থিম.লাইট.নোটাইটেলবার" আপনার ভিউ.ব্রিংটোফ্রন্টের তুলনায় ক্রিয়াকলাপে (); নিখুঁতভাবে কাজ করে, তবে আমি অ্যান্ড্রয়েড: থিম = "@ অ্যান্ড্রয়েড: স্টাইল / থিম। অ্যাপকম্প্যাট.লাইট.নো অ্যাকশনবার" আপনারভিউ.ব্রিংটফ্রন্ট () ব্যবহার করেছি; কাজ করে না যে কোনও ক্লু।
রাহুল

42

আমি একটি ভাল উত্তর খুঁজে পেতে স্ট্যাক ওভারফ্লো দেখেছি এবং যখন আমি একটি খুঁজে পেলাম না তখন আমি ডক্সটি সন্ধান করেছি।

এই সহজ উত্তরটিতে এখনও কেউ হোঁচট খেয়েছে বলে মনে হচ্ছে না:

ViewCompat.setTranslationZ(view, translationZ);

ডিফল্ট অনুবাদ z 0.0


এটি পিক্সেলের জেড-অ্যাক্সেসের উপাদানগুলির অবস্থান, যা উচ্চতা হিসাবেও পরিচিত। সেট ট্রান্সলেশনএক্স এক্স-অক্ষ (বাম / ডান), সেট-ট্রান্সলেশন ওয়াই-অক্ষের (উপরে / নীচে) বরাবর দৃশ্যটি সরিয়ে ফেলবে। জেড-অক্ষটি 3 য় অক্ষ।
xdevs23

কি হবে setZ()? আমি যদি সঠিকভাবে মনে করি তবে জেড জেড পজিশনটি এর উচ্চতা এবং এর অনুবাদ জেড, সর্বোপরি।
Gensoukyou1337

2
@ Gensoukyou1337, তারপরে ViewCompat.setZ(view, yourValueInPixels); view.setZ()শুধুমাত্র 21 এপ্রিল এবং তার চেয়ে বেশি এর উপর কাজ করে।
জনি পাঁচ

1
অ্যান্ড্রয়েড স্টুডিওতে জাভা 8 কোডটি চেক করা হয়েছে - এটি কেবল এসডি কেএনপিটি> = 21 কিনা পরীক্ষা করে, তাই <21 এপিআই এর জন্য এর কোনও প্রভাব নেই।
ভাদিম


25

bringToFront()সঠিক উপায়, তবে, লক্ষ্য করুন যে আপনাকে অবশ্যই উচ্চতর স্তরের ভিউতে (আপনার মূল দৃষ্টিভঙ্গির নীচে) কল করতে হবে bringToFront()এবং invalidate()পদ্ধতিটি অবশ্যই :

আপনার দেখার হায়ারার্কিটি হ'ল:

-RelativeLayout
|--LinearLayout1
|------Button1
|------Button2
|------Button3
|--ImageView
|--LinearLayout2
|------Button4
|------Button5
|------Button6

সুতরাং, আপনি যখন আপনার বোতামগুলি অ্যানিমেট করবেন (1-> 6), তখন আপনার বোতামগুলি নীচে (নীচে) থাকবে ImageView। এটির উপরে (উপরে) আনতে ImageViewআপনাকে অবশ্যই এসএমএসে কল bringToFront()এবং invalidate()পদ্ধতি করতে হবে LinearLayout। তারপরে এটি কাজ করবে :) ** দ্রষ্টব্য: android:clipChildren="false"আপনার মূলের বিন্যাস বা অ্যানিমেট-ভিউ'র গ্রেডপ্যারেন্ট_লআউট সেট করার জন্য মনে রাখবেন । আসুন আমার আসল কোডটি একবার দেখুন:

.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:hw="http://schemas.android.com/apk/res-auto"
    android:id="@+id/layout_parent"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/common_theme_color"
    android:orientation="vertical" >

    <com.binh.helloworld.customviews.HWActionBar
        android:id="@+id/action_bar"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dimen_actionbar_height"
        android:layout_alignParentTop="true"
        hw:titleText="@string/app_name" >
    </com.binh.helloworld.customviews.HWActionBar>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/action_bar"
        android:clipChildren="false" >

        <LinearLayout
            android:id="@+id/layout_top"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:gravity="center_horizontal"
            android:orientation="horizontal" >
        </LinearLayout>

        <ImageView
            android:id="@+id/imgv_main"
            android:layout_width="@dimen/common_imgv_height"
            android:layout_height="@dimen/common_imgv_height"
            android:layout_centerInParent="true"
            android:contentDescription="@string/app_name"
            android:src="@drawable/ic_launcher" />

        <LinearLayout
            android:id="@+id/layout_bottom"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:gravity="center_horizontal"
            android:orientation="horizontal" >
        </LinearLayout>
    </RelativeLayout>

</RelativeLayout>

জাভা কিছু কোড

private LinearLayout layoutTop, layoutBottom;
...
layoutTop = (LinearLayout) rootView.findViewById(R.id.layout_top);
layoutBottom = (LinearLayout) rootView.findViewById(R.id.layout_bottom);
...
//when animate back
//dragedView is my layoutTop's child view (i added programmatically) (like buttons in above example) 
dragedView.setVisibility(View.GONE);
layoutTop.bringToFront();
layoutTop.invalidate();
dragedView.startAnimation(animation); // TranslateAnimation
dragedView.setVisibility(View.VISIBLE);

GLuck!


আপনি যদি কেবলমাত্র বাটনটি চিত্রের দৃষ্টিভঙ্গির উপরে রাখতে চান এবং অন্যান্য বোতামগুলি নয়?
আদম কাটজ

@ অ্যাডামক্যাটজ: আমি মনে করি আপনাকে অবশ্যই এগুলি অন্য স্তরের মুষ্টিতে পুনরায় সংগঠিত করতে হবে। তারপরে, এটি আপনার পথে আনুন।
জাস্টিন

ধন্যবাদ আমি একটি পুনরুদ্ধারকারী দৃশ্যের কেবলমাত্র একটি আইটেম একটি ভিউয়ের উপরে আনার চেষ্টা করছি তবে অন্যান্য আইটেমগুলি নীচে রেখে দেই, বেশ আটকে গেল!
অ্যাডাম কাটজ

আমি একই ব্যবহার। এটি সরঞ্জামদ্বারটি আড়াল করে এমন একটি সমস্যা নিয়ে এটি কাজ করে।
ব্যবহারকারী 2980181

এটি কি একাধিক স্তর নিয়ে কাজ করে? ধরা যাক যে আমার একটিতে ConstraintLayoutএকটি রয়েছে RelativeLayoutএবং অন্যটি RelativeLayoutউভয়ই এর মূল ConstraintLayout( match_parent) এর সমান আকার । প্রথমটির RelativeLayoutএকটি আছে Button, এবং দ্বিতীয়টির (জেড-অর্ডার অনুযায়ী) পিছনে রয়েছে RelativeLayout। আমি কি Buttonপ্রথমটিতে RelativeLayoutপ্রদর্শিত হতে পারি যেন এটি সমস্ত কিছুর শীর্ষে থাকে, যেমন এটি দৃশ্যমান এবং ক্লিকযোগ্য, ব্যবহার করে View::bringToFront()?
ওসকামায়

25

এক্সএমএলে এই কোড সহ

 android:translationZ="90dp"

3
কোথা 90dpথেকে এল ?
সুধীর খঞ্জার

1
এটি ম্যানুয়াল এন্ট্রি। আপনি আপনার প্রয়োজনের উপর ভিত্তি করে চেষ্টা করতে পারেন। হয় 45 ডিপি বা 135 ডিপি বা 180 ডিপি বা 270 ডিপি
কৃষ্ণ

আপনি কি শুধু 1 ডিপি ব্যবহার করতে পারবেন না?
টাইলার টার্নবুল

18

চেষ্টা করুন FrameLayout, এটি আপনাকে একে অপরের উপরে মতামত রাখার সম্ভাবনা দেয়। আপনি দুটি তৈরি করতে পারেন LinearLayouts: একটি পটভূমি দর্শনের সাথে এবং একটি অগ্রভাগের ভিউ সহ এবং ব্যবহার করে এগুলি একত্রিত করতে পারেন FrameLayout। আশাকরি এটা সাহায্য করবে.


1
ডায়ালগের মতো কীভাবে আমরা এটিকে শীর্ষে আনতে পারি?
গৌরব অরোরা

@ ইনফিনিটি, আপনি এই উদ্দেশ্যে একটি ফ্র্যাগমেন্টডায়ালগ তৈরি করতে পারেন, বা আপনার ক্রিয়াকলাপের জন্য কেবল থিম.ডায়ালগ ব্যবহার করতে পারেন।
ডিমের

আমি ফ্রেগমেন্টডায়ালগটি এপিআই 10 এর সাথে বেমানান হওয়ায় ব্যবহার করতে পারি না ly দ্বিতীয়ত, আমি ইতিমধ্যে আমার অ্যাপ্লিকেশনের জন্য একটি থিম ব্যবহার করছি। অন্য কোন উপায আছে কি ? আপনি যেমনটি বলেছেন ঠিক তেমনই আমি এটি ফ্রেমলয়েট ব্যবহার করেছি!
গৌরব অরোরা

@Infinity, আপনি কোন এপিআই 4. থেকে পাওয়া যায় FragmentDialog এর সামঞ্জস্য গ্রন্থাগার সংস্করণ, ব্যবহার করতে পারেন
egor

8

আপনি যদি ব্যবহার করে থাকেন ConstraintLayoutতবে অন্যান্য উপাদানগুলির চেয়ে সামান্য উপাদানটিকে সামনে রেখে অন্য উপাদানগুলির পরে রাখুন



3

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

Dialog topDialog = new Dialog(this, android.R.style.Theme_Translucent_NoTitleBar);
topDialog.setContentView(R.layout.dialog_top);
topDialog.show();

টিনফ্রন্ট () আমার মতো কিছু ক্ষেত্রে কাজ নাও করতে পারে। তবে ডায়ালগ_টপ লেআউটের বিষয়বস্তু অবশ্যই ইউআই স্তরের যে কোনও কিছুকে ওভাররাইড করতে হবে। তবে যাইহোক, এটি একটি কুরুচিপূর্ণ কাজ।


3

আমিও একই সমস্যার মুখোমুখি হয়েছি। নিম্নলিখিত সমাধানটি আমার পক্ষে কাজ করেছে।

 FrameLayout glFrame=(FrameLayout) findViewById(R.id.animatedView);
        glFrame.addView(yourView);
        glFrame.bringToFront();
        glFrame.invalidate();

২ য় সমাধান হল এক্সএমএল ব্যবহার করে এই বৈশিষ্ট্যটি এক্সএমএলটিতে যুক্ত করা

android:translationZ=""

2

আপনি এইভাবে বাইন্ডিংএডাপ্টার ব্যবহার করতে পারেন:

@BindingAdapter("bringToFront")
public static void bringToFront(View view, Boolean flag) {
    if (flag) {
        view.bringToFront();
    }
}


  <ImageView
        ...
        app:bringToFront="@{true}"/>

0

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


0

আপনি যদি কোনও ব্যবহার করছেন তবে আপনার LinearLayoutকল করা উচিত myView.bringToFront()এবং কল করার পরে parentView.requestLayout()এবং parentView.invalidate()পিতামাতাকে নতুন সন্তানের ক্রম দিয়ে পুনরায় আঁকতে বাধ্য করা।


0

এটির উপরে উচ্চতা ব্যবহার করার চেষ্টা করুন, এরকম কিছু yourview.setElevation(5);


0

স্ট্যাক ধন্যবাদ ব্যবহারকারী উপর এই ব্যাখ্যা, আমি এমনকি অ্যান্ড্রয়েড 4.1.1 এই পরিশ্রমী পেয়েছেন

((View)myView.getParent()).requestLayout();
myView.bringToFront();

আমার গতিশীল ব্যবহারের ক্ষেত্রে, উদাহরণস্বরূপ, আমি করেছি

public void onMyClick(View v)
     {
     ((View)v.getParent()).requestLayout();
     v.bringToFront();
     }

ও বামম!


-2

আপনি যে ক্রমটি প্রদর্শন করতে চান সেগুলিতে সেগুলি সাজান। ধরুন, আপনি ভিউ শীর্ষে 1 টি দেখাতে চান 2 তারপরে ভিউ 2 কোড লিখুন তারপর ভিউ 1 কোডটি লিখুন। যদি আপনি এই অর্ডারিংটি করতে না পারেন তবে আপনি যে লেআউটটি সামনে আনতে চান তার মূল দৃশ্যে টিমফ্রন্ট () কে কল করুন।


-32

আপনি অন্য মতামতের মিথ্যাতে দৃশ্যমানতা সেট করতে পারেন।

view1.setVisibility(View.GONE);
view2.setVisibility(View.GONE);
...

অথবা

view1.setVisibility(View.INVISIBLE);
view2.setVisibility(View.INVISIBLE);
...

এবং সেট

viewN.setVisibility(View.VISIBLE);

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