একটি বোতামের মতো লিনিয়ারলআউট কাজ করা


101

আমার কাছে এমন একটি রয়েছে LinearLayoutযা আমি দেখতে দেখতে স্টাইল করেছি buttonএবং এতে কয়েকটি পাঠ্য / ইমেজভিউ উপাদান রয়েছে। আমি পুরো LinearLayoutআইনটিকে একটির মতো করতে চাই button, বিশেষত এটিতে এমন একটি রাজ্যকে সংজ্ঞায়িত করা যাতে এটি চাপা দেওয়ার পরে আলাদা পটভূমি থাকে।

ImageButtonপুরো লেআউটটির আকার তৈরি করা এবং একেবারে অবস্থান নির্ধারণের চেয়ে আরও ভাল কোনও উপায় কি আছে ?


যদি কেউ একটি উপায় TableRow (ক বাটন মত) টেপার সাথে (যা একটি LinearLayout থেকে উত্তরাধিকারসূত্রে হয়) হাইলাইট করতে জন্য খুঁজছেন হয় দেখতে stackoverflow.com/a/8204768/427545
Lekensteyn

4
যদি কেউ পুরো সমাধান পেতে চান তবে এই সংগ্রহস্থলটি দেখুন: github.com/shamanland/AndroidLayoutSelector এরLinearLayout মতো কাস্টম ক্লিকযোগ্য / চেকযোগ্য রয়েছেToggleButton
ওলেক্সি কে।

উত্তর:


155

আমি এখনই এই সমস্যার মধ্যে দৌড়েছি। আপনি ক্লিকযোগ্য হিসাবে লিনিয়ারলআউট সেট করতে হবে। আপনি হয় এক্সএমএল দিয়ে এটি করতে পারেন

android:clickable="true"

বা কোড সহ

yourLinearLayout.setClickable(true);

চিয়ার্স!


4
নীচের উত্তরটি আরও ভাল!
জ্যাচ স্পার্সকে

4
এছাড়াও, যদি আপনার শিশু হিসাবে "ক্লিকযোগ্য" উপাদান থাকে তবে android:clickable="false"ক্লিক ইভেন্টগুলি ব্লক করা থেকে বিরত রাখতে এটিকে যুক্ত করতে ভুলবেন না ।
TheKlpit

প্রয়োজনীয় নয়, ক্লিক শ্রোতা যুক্ত করা আমার পক্ষে যথেষ্ট ছিল এবং আপনি যদি একটি ক্লিক শ্রোতা না চান তবে আপনি কেন কিছু ক্লিকযোগ্য হতে চান?
এইচএমএক

158

আপনি যদি Layout"ক্লাইকেবল" এর মতো ক্রিয়া করতে অ্যান্ড্রয়েড ডিফল্ট ব্যাকগ্রাউন্ড আচরণ যুক্ত করতে চান তবে Viewলক্ষ্যবস্তুতে সেট করুন Layout:

এপিআই 11+ (খাঁটি অ্যান্ড্রয়েড):

android:background="?android:attr/selectableItemBackground"

এপিআই 7+ (অ্যান্ড্রয়েড + অ্যাপকম্প্যাট সহায়তা লাইব্রেরি):

android:background="?attr/selectableItemBackground"

যে কোনও এপিআই:

android:background="@android:drawable/list_selector_background"

উপরের উত্তরগুলি এখনও সত্য তবে কেবলমাত্র চাপ দেওয়া এবং প্রকাশিত ইউআই রাষ্ট্র যুক্ত করার জন্য আমাকে সহায়তা করেনি ( ListViewউদাহরণস্বরূপ)।


আপনার জন্য +1, আপনি যদি ইউআই টাচের প্রতিক্রিয়া চান তবে এটি ক্লিক-লজিকটি নিজেই পরিচালনা করতে চান (এবং কোনও অন্লিকএক্সএক্স পদ্ধতি যা অ্যান্ড্রয়েড: ক্লিকযোগ্যের জন্য প্রয়োজন তা নির্দিষ্ট করে দেওয়ার জন্য বাধ্য হবেন না)
রিক বারখাউস

4
এটি মেটেরিয়াল ডিজাইনের রিপলগুলির সাথেও কাজ করে। সেরা উত্তর.
মিরো মার্কারভনেস

4
ভাল! চাপলে এটি চেপে দেওয়া প্রভাব হিসাবে কমলা / হলুদ রঙের মতো হয়ে যায়। আমি রঙ সবুজ করতে চান এটা কিভাবে করতে হবে?
হ্যান হোয়াইটিং

পছন্দ করেছেন
জ্যাকব সানচেজ

16

আমি প্রথম এবং দ্বিতীয় উত্তরটি ব্যবহার করেছি। তবে আমার লিনিয়ারলআউটে পটভূমির রঙ সহ চিত্র এবং পাঠ্য রয়েছে, তাই আমাকে "পটভূমি" পরিবর্তন করে "অগ্রভাগ" করতে হয়েছিল

রৈখিক

android:foreground="?android:attr/selectableItemBackground"
android:clickable="true"

9

প্রথমে আপনি নির্বাচককে বিভিন্ন রাজ্যের সংজ্ঞা দিতে চাইবেন। উদাহরণস্বরূপ, একটি এক্সএমএল ফাইলে:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/button_pressed"
          android:state_pressed="true" />
    <item android:drawable="@drawable/button_focused"
          android:state_focused="true" />
    <item android:drawable="@drawable/button_normal" />
</selector>

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

যদি এটি না হয় তবে আপনি রিলেটিভলআউট ব্যবহার করে স্যুইচ করতে পারেন এবং প্লেগ্রাউন্ড হিসাবে এই নির্বাচকটির সাথে প্রথম উপাদানটিকে একটি বোতাম তৈরি করতে পারেন এবং এর বিন্যাসের প্রস্থ এবং উচ্চতার জন্য ফিল_প্যারেন্টটি বেছে নিতে পারেন। এই ক্ষেত্রে, কেবলমাত্র একটি নিয়মিত বোতাম ব্যবহার করুন এবং আপনার নির্বাচকটির অ্যান্ড্রয়েড: ব্যাকগ্রাউন্ড সেট করুন। আপনাকে আপনার বোতামে পাঠ্য লাগবে না।


হ্যাঁ, আমি প্রকৃত ব্যবহারের পক্ষে ভোট দিই ButtononDraw(Canvas)আপনার বিশেষ যা কিছু প্রয়োজন তা করতে করতে ওভাররাইড করতে পারেন (যেমন, বোতামের মধ্যে চিত্র বা টেক্সট আঁকুন)
ডেভ

4
ধন্যবাদ! লিনিয়ারলআউটটির পটভূমি সেট করা কাজ করে এবং এটি ইভেন্টগুলির স্পর্শগুলিতে প্রতিক্রিয়া জানায়, প্রায়শই যদি আমি সরাসরি লিনিয়ারলআউট টিপ করি তবে এর রাজ্যটি আপডেট হয়ে গেছে। আমি যদি এর ভিতরে টেক্সটভিউ টিপ করি তবে স্পর্শ ইভেন্টটি এটি লিনিয়ারলআউট পর্যন্ত তৈরি করবে বলে মনে হয় না। লেআউটটিকে কীভাবে হিট-টেস্ট করবেন?
জেসন প্রাদো

অ্যান্ড্রয়েড চেষ্টা করুন: টেক্সটভিউতে ক্লিকযোগ্য = "মিথ্যা"। এটি চেষ্টা করে দেখেনি, তবে টেক্সটভিউগুলির মাধ্যমে ক্লিক করতে আমার কোনও সমস্যা হয়নি। আপনার টেক্সটভিউয়ের ব্যাকগ্রাউন্ড রয়েছে বলেই এটি হতে পারে।
টেনফোর04

এটি কৌশলটি কার্যকর করেছে, যদিও এটি ক্লিক সাউন্ড করে না। এটি করার কোনও উপায় আছে কি?
স্টিভেন

@ স্টিভেন স্রেফ আপনার পুরানো মন্তব্য দেখেছি, দুঃখিত। আমি মনে করি ক্লিক সাউন্ডটি অনক্লিকলিস্টনার নির্ধারিত হওয়ার সাথে আবদ্ধ। আমার একটি অন টাচলিস্টেনারের সাথে কিছু ছিল এবং আমি অনক্লিকলিস্টনার (একটি খালি অন ক্লিকের পদ্ধতি সহ) যোগ না করা পর্যন্ত এটি ক্লিক করবে না।
টেনফোর04

7

আমি যে অ্যাপ্লিকেশনটিতে কাজ করছি তাতে আমার গতিশীলভাবে লিনিয়ারলআউট তৈরি করতে হবে। এই ক্ষেত্রে কমান্ড

ll.setClickable(true);

করার মতো কাজ করছে না। যদিও আমি কিছু মিস করতে পারি, তবে একই ফলাফলটি পেতে আমি সেটঅন্টিচলিস্টনারকে কাজে লাগাতে সক্ষম হয়েছি এবং কারও যদি প্রয়োজন হয় তবে আমি কোডটি জমা দিই।

নিম্নলিখিত কোডটি দুটি পাঠ্যদর্শন এবং বৃত্তাকার কোণার সাথে একটি লিনিয়ারলআউট তৈরি করে, চাপলে রঙ পরিবর্তন করে।

প্রথমত, অঙ্কনযোগ্য ফোল্ডারে দুটি এক্সএমএল ফাইল তৈরি করুন, একটি স্বাভাবিকের জন্য এবং একটি চাপিত লিনিয়ারলআউট স্টেটের জন্য।

সাধারণ রাষ্ট্রের এক্সএমএল (অঙ্কনযোগ্য / বৃত্তাকার_আজাগুলি_ সাধারণ.এক্সএমএল)

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#FFFFFF" />
            <corners android:radius="7dp" />
            <padding android:left="5dip" android:top="5dip" android:right="5dip" android:bottom="5dip" />
        </shape>
    </item>
    <item android:bottom="3px">
        <shape android:shape="rectangle">
            <solid android:color="#F1F1F1" />
            <corners android:radius="7dp" />
        </shape>
    </item>
</layer-list>

চাপা স্থিতির এক্সএমএল (অঙ্কনযোগ্য / গোলকৃত_আজাগুলি_প্রেস.এক্সএমএল)। পার্থক্য কেবল রঙে ...

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#FFFFFF" />
            <corners android:radius="7dp" />
            <padding android:left="5dip" android:top="5dip" android:right="5dip" android:bottom="5dip" />
        </shape>
    </item>
    <item android:bottom="3px">
        <shape android:shape="rectangle">
            <solid android:color="#add8e6" />
            <corners android:radius="7dp" />
        </shape>
    </item>
</layer-list>

তারপরে নিম্নলিখিত কোডটি কাজ করে

গ্লোবাল ভেরিয়েবল:

public int layoutpressed = -1;

ইন onCreate():

// Create some textviews to put into the linear layout...
TextView tv1 = new TextView(this);
TextView tv2 = new TextView(this);
tv1.setText("First Line");
tv2.setText("Second Line");

// LinearLayout definition and some layout properties...
final LinearLayout ll = new LinearLayout(context);
ll.setOrientation(LinearLayout.VERTICAL);

// it is supposed that the linear layout will be in a table.
// if this is not the case for you change next line appropriately...
ll.setLayoutParams(new TableRow.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

ll.setBackgroundResource(R.drawable.rounded_edges_normal);
ll.addView(tv1);
ll.addView(tv2);
ll.setPadding(10, 10, 10, 10);
// Now define the three button cases
ll.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View arg0, MotionEvent arg1) {
                if (arg1.getAction()==MotionEvent.ACTION_DOWN){
                        ll.setBackgroundResource(R.drawable.rounded_edges_pressed);
                        ll.setPadding(10, 10, 10, 10);
                        layoutpressed = arg0.getId();
                }
                else if (arg1.getAction()== MotionEvent.ACTION_UP){
                        ll.setBackgroundResource(R.drawable.rounded_edges_normal);
                        ll.setPadding(10, 10, 10, 10);
                        if(layoutpressed == arg0.getId()){
                            //  ...........................................................................
                            // Code to execute when LinearLayout is pressed...
                            //  ........................................................................... 
                     }
          }
          else{
                ll.setBackgroundResource(R.drawable.rounded_edges_showtmimata);
                ll.setPadding(10, 10, 10, 10);
                layoutpressed = -1;
          }
          return true;
                }
  });           


5

লিনিয়ার লেআউটে কেবল ব্যাকগ্রাউন্ড অ্যাটর / নির্বাচনযোগ্য আইটেমব্যাকগ্রাউন্ড যুক্ত করুন এবং সেই লিনিয়ারলআউট ক্লিকযোগ্যযোগ্যও করুন

উদাহরণ:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/linear1"
android:background="?android:attr/selectableItemBackground"
android:clickable="true"
android:focusable="true">

এটি টিপলে বোতামের মতো লিনিয়ারলেআউট কাজ করুন। :)


1

এটি সহায়ক ছিল তবে আপনি যদি পটভূমির রঙ রাখতে চান এবং তালিকার আইটেমের মতো লিনিয়ার লেআউটটিকে ক্লিকযোগ্য করে তুলতে চান। আপনার পছন্দসই রঙের সাথে ব্যাকগ্রাউন্ড সেট করুন এবং অ্যান্ড্রয়েডে ফোরগ্রাউন্ড রঙ সেট করুন: অ্যাট্রি / নির্বাচনযোগ্য আইটেমব্যাকগ্রাউন্ড, ফোকাসযোগ্য সত্য এবং ক্লিকযোগ্য সত্যকে সেট করুন

কোডের উদাহরণ

   <LinearLayout

        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp"
        android:background="#FF0"
        android:orientation="horizontal"
        android:paddingBottom="10dp"
         android:paddingTop="10dp"
        android:onClick="onClickMethod"
        android:clickable="true"
        android:focusable="true"
        android:foreground="?android:attr/selectableItemBackground"
        />

0

পূর্ববর্তী প্রশ্নগুলি কীভাবে এক্সএমএল ফাইলে ডিফল্ট পটভূমি সেট করবেন about এখানে কোড একই জিনিস:

linearLayout1.setBackgroundResource(android.R.drawable.list_selector_background);

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