কীভাবে প্রোগ্রামিয়ালি কোনও দৃশ্যে শৈলীর বৈশিষ্ট্য সেট করা যায়


107

আমি নীচের কোড সহ এক্সএমএল থেকে একটি ভিউ পাচ্ছি:

Button view = (Button) LayoutInflater.from(this).inflate(R.layout.section_button, null);

আমি বোতামটির জন্য একটি "স্টাইল" সেট করতে চাই যে আমি জাভাতে কীভাবে এটি করতে পারি যেহেতু আমি প্রতিটি বোতামটি ব্যবহার করব তার জন্য বেশ কয়েকটি স্টাইল ব্যবহার করতে চাই।

উত্তর:


52

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

এর মতো একটি জিনিস রয়েছে StateListDrawableযা আপনাকে প্রতিটি রাজ্যের জন্য আলাদা করে আঁকতে সক্ষম হিসাবে সংজ্ঞায়িত করতে দেয় Button, কেন আপনি কেন্দ্রীভূত, নির্বাচিত, চাপযুক্ত, অক্ষম ইত্যাদি।

উদাহরণস্বরূপ, আপনার বোতামটি টিপলে রঙ পরিবর্তন করার জন্য, আপনি এক্সএমএল ফাইলটিকে res/drawable/my_button.xmlডিরেক্টরি নামে পরিচিত করতে পারেন:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item
    android:state_pressed="true"
    android:drawable="@drawable/btn_pressed" />
  <item
    android:state_pressed="false"
    android:drawable="@drawable/btn_normal" />
</selector>

তারপরে আপনি Buttonসম্পত্তিটি সেট করে এই নির্বাচকটিকে প্রয়োগ করতে পারেন android:background="@drawable/my_button"


4
আমার সমস্যাটি হ'ল আমি কোনও ওয়েবসার্ভিস থেকে ডেটা লোড করি যা আমার বোতামের তথ্য বর্ণনা করে। বোতামগুলির নিজস্ব শ্রেণীর উপর ভিত্তি করে আলাদা স্টাইল থাকা দরকার। এজন্য আমি গতিশীল স্টাইল সেট করতে চাই।
Lint_

3
ঠিক আছে আপনি অ্যান্ড্রয়েড styleবৈশিষ্ট্যটি পরিবর্তন করতে পারবেন না , তবে প্রোগ্রামালিমে আপনি যে কোনও Buttonপছন্দ মতো একটি পটভূমি সেট করতে পারেন, যদি এটি যথেষ্ট হয়, এছাড়াও, Buttonউত্তরাধিকার হিসাবে TextView, আপনি পাঠ্য বৈশিষ্ট্য পরিবর্তন করতে পারেন। এই আইটেমগুলির জন্য কেবলমাত্র API ডকুমেন্টেশনটি দেখুন ... developer.android.com/references/android/view/…
ক্রিস্টোফার অর

আমি কেবল এটি করার বিষয়ে ভাবছিলাম, আমার নতুন উত্তর আছে কিনা তা পরীক্ষা করার আগেই। অনেক ধন্যবাদ.
লিন্ট_

5
কোনও বোতামের জন্য কোনও শৈলী তৈরি করা সম্ভব নয় যা পাঠ্যের আকার, মার্জিন ইত্যাদির সংজ্ঞা দেয় এবং তারপরে এটি অগ্রগতিযুক্ত কোনও বোতামে প্রয়োগ করুন। অবশ্যই এর সম্ভাব্য বলতে যদি আমার কাছে ছয়টি বোতাম থাকে যা একই শৈলীটি পেতে চায়?
ভালুক

আমরা কোন গুণাবলী ফুলে উঠতে পারি? আমরা কি মার্জিন, প্যাডিং স্ফীত করতে পারি?
অ্যান্ড্রয়েড ম্যান

49

প্রথমত, একটি সাধারণ বোতাম তৈরি করতে আপনার কোনও লেআউট ইনফ্লেটার ব্যবহার করার দরকার নেই। আপনি কেবল ব্যবহার করতে পারেন:

button = new Button(context);

আপনি যদি বাটনটি স্টাইল করতে চান তবে আপনার 2 টি পছন্দ রয়েছে: সর্বাধিক সহজ হ'ল কোডের মধ্যে সমস্ত উপাদান নির্দিষ্ট করা, যেমন উত্তরগুলির অনেকের মত প্রস্তাব:

button.setTextColor(Color.RED);
button.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);

অন্য বিকল্পটি হ'ল এক্সএমএলে শৈলীর সংজ্ঞা দেওয়া এবং বোতামটিতে এটি প্রয়োগ করা। সাধারণ ক্ষেত্রে, আপনি এটির জন্য একটি ব্যবহার করতে পারেন ContextThemeWrapper:

ContextThemeWrapper newContext = new ContextThemeWrapper(baseContext, R.style.MyStyle);
button = new Button(newContext);

একটি টেক্সটভিউতে পাঠ্য-সম্পর্কিত বৈশিষ্ট্যগুলি পরিবর্তন করতে (বা এটির বোতামের মতো সাবক্লাস) একটি বিশেষ পদ্ধতি রয়েছে:

button.setTextAppearance(context, R.style.MyTextStyle);

এই শেষটি সমস্ত বৈশিষ্ট্য পরিবর্তন করতে ব্যবহার করা যাবে না; উদাহরণস্বরূপ প্যাডিং পরিবর্তন করার জন্য আপনাকে একটি ব্যবহার করতে হবে ContextThemeWrapper। তবে পাঠ্যের রঙ, আকার ইত্যাদির জন্য আপনি ব্যবহার করতে পারেন setTextAppearance


1
শুধু উজ্জ্বল. ContextThemeWrapper - এটাই আমি এতক্ষণ খুঁজছিলাম।
আয়াজ আলিফভ

এটি চমত্কারভাবে কাজ করে। কিছুক্ষণের জন্য এই সমাধানটির সন্ধান করা হয়েছে।
জেসনজউলিভিয়ামস 22:18

14

হ্যাঁ, আপনি উদাহরণস্বরূপ একটি বোতামে ব্যবহার করতে পারেন

Button b = new Button(this);
b.setBackgroundResource(R.drawable.selector_test);

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

11

আপনি স্টাইল বৈশিষ্ট্যগুলি এর মতো করতে পারেন:

Button myButton = new Button(this, null,android.R.attr.buttonBarButtonStyle);

এর জায়গায়:

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/btn"
    style="?android:attr/buttonBarButtonStyle"

    />

7
একটি বোতাম বিবেচনা করে উত্তম উত্তর তৈরি করা হবে। বিদ্যমান বোতামটির জন্য এটি কীভাবে করা যায় তা দেখে ভাল লাগবে।
গুণমান অনুঘটক

সিজার্ড থেকে উত্তর দেখুন।
ক্রিস্টি ওয়েলশ

10

আপনি যদি সমর্থন লাইব্রেরি ব্যবহার করছেন তবে আপনি কেবল ব্যবহার করতে পারেন

TextViewCompat.setTextAppearance(textView, R.style.AppTheme_TextStyle_ButtonDefault_Whatever);

টেক্সটভিউ এবং বোতামগুলির জন্য। বাকি দর্শনগুলির জন্য একই ধরণের ক্লাস রয়েছে :-)


এই স্টাইলটি পেতে আপনার কোন আর প্যাকেজটি ব্যবহার করা উচিত?
htafoya

6

যে কোনও উপাদানের উত্তর খুঁজছেন তাদের জন্য এই এসও পোস্টটি দেখুন: মেটেরিয়াল ডিজাইন এবং অ্যাপকম্প্যাট সহ অ্যান্ড্রয়েডে রঙিন বোতামগুলি

আমি আমার বোতামটির জন্য বোতামের ডিফল্ট পাঠ্যের রঙ সাদা করতে এই উত্তরের সংমিশ্রণটি ব্যবহার করেছি: https://stackoverflow.com/a/32238489/3075340

তারপরে এই উত্তরটি https://stackoverflow.com/a/34355919/3075340 প্রোগ্রামযুক্তভাবে পটভূমির রঙ সেট করতে। এর জন্য কোডটি হ'ল:

ViewCompat.setBackgroundTintList(your_colored_button,
 ContextCompat.getColorStateList(getContext(),R.color.your_custom_color));

your_colored_buttonButtonআপনি যদি চান তবে কেবল একটি নিয়মিত বা অ্যাপকম্প্যাট বোতাম হতে পারে - আমি উভয় প্রকারের বোতামের সাথে উপরের কোডটি পরীক্ষা করেছি এবং এটি কাজ করে।

সম্পাদনা: আমি দেখেছি যে প্রি-ললিপপ ডিভাইসগুলি উপরের কোডটি দিয়ে কাজ করে না। প্রাক-ললিপপ ডিভাইসগুলির জন্য কীভাবে সমর্থন যুক্ত করবেন এই পোস্টটি দেখুন: https://stackoverflow.com/a/30277424/3075340

মূলত এটি করুন:

Button b = (Button) findViewById(R.id.button);
ColorStateList c = ContextCompat.getColorStateList(mContext, R.color.your_custom_color;
Drawable d = b.getBackground();
if (b instanceof AppCompatButton) {
    // appcompat button replaces tint of its drawable background
    ((AppCompatButton)b).setSupportBackgroundTintList(c);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    // Lollipop button replaces tint of its drawable background
    // however it is not equal to d.setTintList(c)
    b.setBackgroundTintList(c);
} else {
    // this should only happen if 
    // * manually creating a Button instead of AppCompatButton
    // * LayoutInflater did not translate a Button to AppCompatButton
    d = DrawableCompat.wrap(d);
    DrawableCompat.setTintList(d, c);
    b.setBackgroundDrawable(d);
}

6

আপনি যে স্টাইলের বৈশিষ্ট্যগুলি পরিবর্তন করতে চান তার উপর নির্ভর করে আপনি প্যারিস লাইব্রেরিটি ব্যবহার করতে পারবেন:

Button view = (Button) LayoutInflater.from(this).inflate(R.layout.section_button, null);
Paris.style(view).apply(R.style.YourStyle);

ব্যাকগ্রাউন্ড, প্যাডিং, টেক্সট সাইজ, টেক্সটকলার ইত্যাদি অনেকগুলি বৈশিষ্ট্য সমর্থিত।

দাবি অস্বীকার: আমি গ্রন্থাগারটি রচনা করেছি।


5

@ ডায়ারম্যান এবং @h_rules এর উত্তর সঠিক। কোড সহ একটি বিস্তৃত উদাহরণ দিতে, অঙ্কনযোগ্য ফোল্ডারে, বাটন_ডিজাবল্ড.এক্সএমএল নামে একটি এক্সএমএল ফাইল তৈরি করুন

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" android:padding="10dp">   
 <solid android:color="@color/silver"/>
<corners
   android:bottomRightRadius="20dp"
   android:bottomLeftRadius="20dp"
   android:topLeftRadius="20dp"
   android:topRightRadius="20dp"/>
</shape>

তারপরে জাভাতে,

((Button) findViewById(R.id.my_button)).setEnabled(false);
((Button) findViewById(R.id.my_button)).setBackgroundResource(R.drawable.button_disabled);

এটি বোতামটির সম্পত্তিটিকে অক্ষম করে এবং রঙ রূপালীতে সেট করবে।

[রঙটি color.xml এ সংজ্ঞায়িত করা হয়েছে:

<resources>

    <color name="silver">#C0C0C0</color>

</resources>

4
@ পেসারিয়ার: প্রশ্নটি একেবারেই বলে না। এটি স্টাইলটি এক্সএমএল বা জাভাতে অস্পষ্ট। এটি কেবল প্রোগ্রামিয়ালি স্টাইলটি কীভাবে সেট করবেন তা জিজ্ঞাসা করে।
হার্ভে

3

রানটাইমের সময়, আপনি কী স্টাইলটি আপনার বোতামটি রাখতে চান তা আপনি জানেন। সুতরাং আগেই, লেআউট ফোল্ডারে এক্সএমএল এ, আপনার প্রয়োজনীয় স্টাইলগুলির সাথে বোতামে যাওয়ার জন্য প্রস্তুত থাকতে পারেন। সুতরাং লেআউট ফোল্ডারে আপনার কাছে ফাইল থাকতে পারে: বোতাম_স্টাইল_1.xML। এই ফাইলের বিষয়বস্তুগুলি দেখতে এমন হতে পারে:

<?xml version="1.0" encoding="utf-8"?>
<Button
    android:id="@+id/styleOneButton"
    style="@style/FirstStyle" />

আপনি যদি খণ্ডগুলি নিয়ে কাজ করছেন, তবে অনক্রিট ভিউ-তে আপনি সেই বোতামটি স্ফীত করে যেমন:

Button firstStyleBtn = (Button) inflater.inflate(R.layout.button_style_1, container, false);

যেখানে ধারক হ'ল ভিগ্রুপ কনটেইনারটি সেই অনক্রেটভিউ পদ্ধতির সাথে যুক্ত যেখানে আপনি নিজের খণ্ড তৈরি করার সময় ওভাররাইড করে।

এরকম আরও দুটি বোতাম দরকার? আপনি তাদের এইভাবে তৈরি করুন:

Button secondFirstStyleBtn = (Button) inflater.inflate(R.layout.button_style_1, container, false);
Button thirdFirstStyleBtn = (Button) inflater.inflate(R.layout.button_style_1, container, false);

আপনি এই বোতামগুলি কাস্টমাইজ করতে পারেন:

secondFirstStyleBtn.setText("My Second");
thirdFirstStyleBtn.setText("My Third");

তারপরে আপনি আপনার কাস্টমাইজড, স্টাইলাইজড বোতামগুলি লেআউট পাত্রে যুক্ত করুন যা আপনি অনক্রিটভিউ পদ্ধতিতে স্ফীত করেছেন:

_stylizedButtonsContainer = (LinearLayout) rootView.findViewById(R.id.stylizedButtonsContainer);

_stylizedButtonsContainer.addView(firstStyleBtn);
_stylizedButtonsContainer.addView(secondFirstStyleBtn);
_stylizedButtonsContainer.addView(thirdFirstStyleBtn);

এবং এভাবেই আপনি স্টাইলাইজড বোতামগুলির সাথে গতিশীলভাবে কাজ করতে পারেন।


0

আমি হোল্ডার প্যাটার্নটি ব্যবহার করে এর জন্য একটি সহায়ক ইন্টারফেস তৈরি করেছি।

public interface StyleHolder<V extends View> {
    void applyStyle(V view);
}

এখন প্রতিটি স্টাইলের জন্য আপনি ব্যবহারিকভাবে ব্যবহার করতে চান কেবল ইন্টারফেসটি প্রয়োগ করুন, উদাহরণস্বরূপ:

public class ButtonStyleHolder implements StyleHolder<Button> {

    private final Drawable background;
    private final ColorStateList textColor;
    private final int textSize;

    public ButtonStyleHolder(Context context) {
        TypedArray ta = context.obtainStyledAttributes(R.style.button, R.styleable.ButtonStyleHolder);

        Resources resources = context.getResources();

        background = ta.getDrawable(ta.getIndex(R.styleable.ButtonStyleHolder_android_background));

        textColor = ta.getColorStateList(ta.getIndex(R.styleable.ButtonStyleHolder_android_textColor));

        textSize = ta.getDimensionPixelSize(
                ta.getIndex(R.styleable.ButtonStyleHolder_android_textSize),
                resources.getDimensionPixelSize(R.dimen.standard_text_size)
        );

        // Don't forget to recycle!
        ta.recycle();
    }

    @Override
    public void applyStyle(Button btn) {
        btn.setBackground(background);
        btn.setTextColor(textColor);
        btn.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
    }
}

আপনার মধ্যে স্টাইলযোগ্য ঘোষণা করুন attrs.xml, এই উদাহরণের জন্য স্টাইলযোগ্য:

<declare-styleable name="ButtonStyleHolder">
    <attr name="android:background" />
    <attr name="android:textSize" />
    <attr name="android:textColor" />
</declare-styleable>

শৈলীতে এখানে ঘোষণা করা হয়েছে styles.xml:

<style name="button">
    <item name="android:background">@drawable/button</item>
    <item name="android:textColor">@color/light_text_color</item>
    <item name="android:textSize">@dimen/standard_text_size</item>
</style>

এবং অবশেষে শৈলী ধারক প্রয়োগ:

Button btn = new Button(context);    
StyleHolder<Button> styleHolder = new ButtonStyleHolder(context);
styleHolder.applyStyle(btn);

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


-1

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

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

    <!-- This is the special two colors background START , after this LinearLayout, you can add all view that have it for main background-->
    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"

    android:weightSum="2"

    android:background="#FFFFFF"
    android:orientation="horizontal"
    >

    <View
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:background="#0000FF" />

    <View
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:background="#F000F0" />
    </LinearLayout>
    <!-- This is the special two colors background END-->

   <TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:gravity="center"
    android:text="This Text is centered with a special backgound,
    You can add as much elements as you want as child of this RelativeLayout"
    android:textColor="#FFFFFF"
    android:textSize="20sp" />
</RelativeLayout>
  • আমি অ্যান্ড্রয়েডের সাথে লিনিয়ারলআউট ব্যবহার করেছি: ওয়েটসাম = "2"
  • আমি দুটি সন্তানের অ্যান্ড্রয়েডকে এন্ড্রয়েড দিয়েছি: লেআউট_ ওয়েট = "1" (আমি প্রতি প্যারেন্ট স্পেসের 50% (প্রস্থ এবং উচ্চতা) দিয়েছি)
  • এবং পরিশেষে, আমি চাইল্ড এলিমেন্টটিকে চূড়ান্ত প্রভাবিত করতে পৃথক পটভূমির দুটি বর্ণকে দিয়েছি।

ধন্যবাদ!

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