প্রোগ্রাম্যাটিকভাবে টেক্সটভিউয়ের জন্য শৈলী সেট করুন


249

আমি TextViewএই জাতীয় শৈলীর সাথে নির্মাণকারীর ব্যবহার করার চেষ্টা করছি :

TextView myText = new TextView(MyActivity.this, null, R.style.my_style);

যাইহোক, আমি যখন এটি করি তখন পাঠ্য দর্শনটি স্টাইলটি উপস্থিত হয় না বলে মনে হয় (আমি স্ট্যাটিকটিকে স্থির বস্তুতে সেট করে যাচাই করেছি)।

আমি চেষ্টা করার চেষ্টা করেছি myText.setTextAppearance(MyActivity.this, R.style.my_style)কিন্তু এটি কাজ করে না।

উত্তর:


318

আমি বিশ্বাস করি না আপনি প্রগতিগতভাবে স্টাইল সেট করতে পারবেন। এটি ঘুরে দেখার জন্য আপনি নির্ধারিত শৈলীর সাহায্যে একটি টেম্পলেট লেআউট এক্সএমএল ফাইল তৈরি করতে পারেন, উদাহরণস্বরূপ রেজ / লেআউটে নিম্নলিখিত কন্টেন্টের মতো টিভিটিম্পলেট.এক্সএমএল তৈরি করুন:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="This is a template"
        style="@style/my_style" />

তারপরে আপনার নতুন টেক্সটভিউটি ইনস্ট্যান্ট করতে এটি স্ফীত করুন:

TextView myText = (TextView)getLayoutInflater().inflate(R.layout.tvtemplate, null);

আশাকরি এটা সাহায্য করবে.


1
যেখানে ড্যান্ড্রে অ্যালিসনের উত্তর এটি জিতেছে এটির জন্য এপিআই ভি 11 প্রয়োজন হয় না।
মার্টিন ক্যাপোডিসি

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

@ ইহারোবআলআসিমি এটি ঠিক আছে, সমস্ত কিছু প্রোগ্রামগতভাবে করা যায় এবং লেআউটআইনফ্লেটার এক্সএমএলকে বস্তুতে রূপান্তরিত করার বিষয়ে সমস্ত কিছু জানেন। দুঃখের বিষয়, এ জাতীয় অনেকগুলি ব্যক্তিগত প্রাইভেট API এর আওতায় লুকানো থাকে এবং কিছু বিষয় তৈরির একমাত্র উপায় হল নির্মাতাকে অ্যাট্রিবিউটসেট সরবরাহ করা।
মিহা_এক্স 64

অন্যান্য জবাবগুলির বিপরীতে এটি স্পিনারদের সাথে কাজ করেছিল তাই আপনার জন্য একটি সোনার তারা
রোয়ান বেরি

121

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

textView.setTextAppearance(this, R.style.MyTextStyle);

সম্পাদনা করুন: এটি প্রসঙ্গকে বোঝায়


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

1
স্ফীত টেম্পলেট ব্যবহার এবং সেটটেক্সট অ্যাপিয়ারেন্স ব্যবহারের উভয় সমাধানই যুক্তিসঙ্গত। ২ য় সমাধানের জন্য প্যাডিং / মার্জিন ইস্যু সম্বোধনের জন্য আপনি পাঠ্য ভিউ.সেটলয়আউটপ্যারামগুলি (লেআউটপ্যারাম) কল করতে পারেন
অ্যালানকলে

এই পদ্ধতিটি এপিআই 23 স্তরে অবহিত করা হয়েছিল। API 23+ এর পরিবর্তে setTextAppearance (int) ব্যবহার করুন।
সের্গেই

নিশ্চিত হয়ে নিন যে সংস্করণটি কমপক্ষে এপিআই 23 (এম)
Br0thazS0ul

4
সমর্থন লাইব্রেরি থেকে পদ্ধতিটি ব্যবহার করুনTextViewCompat.setTextAppearance
রুবিন ইউ

97

আপনি কনস্ট্রাক্ট থেমর্যাপারটি এর মতো নির্মাতাকে দিতে পারেন:

TextView myText = new TextView(new ContextThemeWrapper(MyActivity.this, R.style.my_style));

1
দুর্দান্ত জিনিস! API 8 সমর্থন করার সময় আমি কেবল প্রোগ্রামে স্টাইলগুলি সেট করতে পারি could
tbraun

কিছু কারণে, এটি আমার বোতামের স্টাইলকে প্রভাবিত করে না। আমি আমার স্টাইল সংজ্ঞায়িত করেছেন: <style name="TabButton"><item name="android:background">@drawable/tabbar_button_bkgnd</item>...</style>। এবং তারপর আমি একটি নির্মাণ সঙ্গে এটি ডাকা: new Button(new ContextThemeWrapper(context, R.style.TabButton));। তবে বোতামটি কেবল আমার সেটিংস উপেক্ষা করে। আমি কি এখানে কিছু ভুল করছি?
আলেকস এন।

@ আলাক্সিজেএন.আপনার উইজেট থেকে এই উত্তরাধিকার নেওয়া উচিত style বাটন স্টাইলটি parent="@android:style/Widget.Button"
এইভাবে

@ ম্যাক্সকান্না কিছু কারণে যুক্ত করা parentকিছুটা পরিবর্তন হয়নি। সুতরাং আমি সলিউশনটি নিয়ে কেবল এগিয়ে গেলাম inflate
আলেক্স এন।

11
@AliakseiN। আপনার 3-আরগ কনস্ট্রাক্টর ব্যবহার করা দরকার, যেমন new Button(new ContextThemeWrapper(context, R.style.TabButton), null, 0)। অন্যথায়, ডিফল্ট বোতাম শৈলী প্রয়োগ করা হবে, এবং এই শৈলীটি কনটেক্সটেম থ্রেড্র্যাপারের মাধ্যমে আপনি যে থিমের সাথে একীভূত করেছেন সেই বোতাম শৈলিকে ওভাররাইড করবে।
নিউটনেক্স

17

আপনি কনস্ট্রাক্টারে স্টাইলটি সেট করতে পারেন (তবে স্টাইলগুলি গতিশীলভাবে পরিবর্তন / সেট করা যায় না)।

View(Context, AttributeSet, int)(এটি intবর্তমান থিমের একটি বৈশিষ্ট্য যা কোনও শৈলীর উল্লেখ রয়েছে)

রোমেন গাইয়ের কাছ থেকে উত্তর

উল্লেখ


আপনার উত্তর বিভ্রান্তিকর - আপনি কি এই থ্রেডটি শেষ পর্যন্ত পড়ার চেষ্টা করেছেন?
andr

3
এটা কীভাবে বিভ্রান্ত? গৃহীত উত্তরটি বিভ্রান্তিমূলক, কারণ রোমেন গাই স্পষ্টভাবে বলেছেন যে আপনি প্রোগ্রামিয়ালি কোনও স্টাইলকে "সেট" করতে পারবেন। এটি পরিবর্তনশীলভাবে পরিবর্তন করার কোনও সুবিধা নেই। এই থ্রেডটি যদিও এটি মনে হয় বলে মনে হয় না।
ডান্ড্রে অ্যালিসন

1
সাবধান, এই কলে এপিআই স্তর 11. প্রয়োজন
মার্টিন Capodici

1
পছন্দ করেছেন
দানড্রে অ্যালিসন

6
গত int- এ হয় না একটি শৈলী সম্পদ। এটি "বর্তমান থিমের একটি বৈশিষ্ট্য যা শৈলীর উত্সের একটি উল্লেখ রয়েছে যা দেখার জন্য ডিফল্ট মান সরবরাহ করে।"
rve 11

11

প্যারামিটার ইন্ট defStyleAttrস্টাইল নির্দিষ্ট করে না। অ্যান্ড্রয়েড ডকুমেন্টেশন থেকে:

DefStyleAttr - বর্তমান থিমের একটি বৈশিষ্ট্য যা শৈলীর উত্সের একটি উল্লেখ রয়েছে যা দেখার জন্য ডিফল্ট মান সরবরাহ করে। ডিফল্ট না দেখার জন্য 0 হতে পারে।

স্টাইলটি ভিউ কনস্ট্রাক্টরে সেটআপ করতে আমাদের কাছে সম্ভাব্য 2 টি সমাধান রয়েছে:

  1. ContextThemeWrapper ব্যবহারের সাথে:

    ContextThemeWrapper wrappedContext = new ContextThemeWrapper(yourContext, R.style.your_style);
    TextView textView = new TextView(wrappedContext, null, 0);
  2. চার-যুক্তিযুক্ত নির্মাণকারীর সাথে (LOLLIPOP থেকে শুরু হওয়া উপলব্ধ):

    TextView textView = new TextView(yourContext, null, 0, R.style.your_style);

উভয় সমাধানের জন্য মূল বিষয় - defStyleAttrআমাদের শৈলীতে দেখার জন্য প্যারামিটারটি 0 হওয়া উচিত।


5

গতিশীল পরিবর্তন শৈলী সমর্থিত (এখনও)। এক্সএমএল এর মাধ্যমে দর্শন তৈরি হওয়ার আগে আপনাকে স্টাইলটি সেট করতে হবে ।


20
যা একই জিনিস হিসাবে ঘটেছিল, আসলে
njzk2

@ njzk2 ধন্যবাদ ... পোস্ট করার আগে স্পষ্টতই তাঁর মন্তব্য সম্পর্কে ভাবেনি। ইউআই তৈরি হওয়ার আগে প্রোগ্রামিয়ালি স্টাইল সেট করার কোনও উপায় নেই, সুতরাং একই কোডটি প্রোগ্রামিকভাবে স্টাইল পরিবর্তন বা সেট করতে ব্যবহৃত হত।
ক্রিস ক্যাশওয়েল

3

গৃহীত উত্তরটি আমার পক্ষে দুর্দান্ত সমাধান ছিল। যুক্ত করার একমাত্র জিনিস inflate()পদ্ধতি সম্পর্কে about

গৃহীত উত্তরে সমস্ত android:layout_*পরামিতি প্রয়োগ করা হবে না।

কারণ এটি সামঞ্জস্য করার কোনও উপায় নয়, কারণ nullহিসাবে পাস করা হয়েছিল ViewGroup parent

আপনি এটি এর মতো ব্যবহার করতে পারেন:

View view = inflater.inflate(R.layout.view, parent, false);

এবং এটি parentহ'ল ViewGroup, যেখান থেকে আপনি সামঞ্জস্য করতে চান android:layout_*

এই ক্ষেত্রে, সমস্ত আপেক্ষিক সম্পত্তি সেট করা হবে।

আশা করি এটি কারও কাজে আসবে।


2

শৈলীর উত্তরাধিকার (বা ইভেন্ট স্টাইলযোগ্য বৈশিষ্ট্য) ব্যবহার করতে পারে এমন কাস্টম ভিউগুলি ব্যবহার করার সময়, শৈলীটি হারাতে না পারার জন্য আপনাকে দ্বিতীয় কনস্ট্রাক্টরটি সংশোধন করতে হবে। এটি আমার জন্য কাজ করেছে, সেটটেক্সট অ্যাপিয়ারেন্স () ব্যবহার করার প্রয়োজন ছাড়াই :

public CustomView(Context context, AttributeSet attrs) {
    this(context, attrs, attrs.getStyleAttribute());
}

2

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

ভিউ কনস্ট্রাক্টরের তৃতীয় প্যারাম নীচের উত্স কোড হিসাবে আপনার থিমটিতে এক ধরণের অ্যাটর্নি গ্রহণ করে:

public TextView(Context context, AttributeSet attrs) {
    this(context, attrs, com.android.internal.R.attr.textViewStyle);
}

সুতরাং আপনাকে অবশ্যই আর স্টাইলের চেয়ে এক প্রকারের আর.আত্র। ** পাস করতে হবে *

আমার কোডগুলিতে, আমি নিম্নলিখিত পদক্ষেপগুলি করেছি:

প্রথমে, এট্রেক্সএক্সএমএলে থিমগুলি দ্বারা ব্যবহৃত একটি কাস্টমাইজড অ্যাটরকে কাস্টমাইজ করুন।

<attr name="radio_button_style" format="reference" />

দ্বিতীয়ত, আপনার ব্যবহৃত থীলে স্টাইল.এক্সএমএল নির্দিষ্ট করুন।

 <style name="AppTheme" parent="android:Theme.Translucent">
    <!-- All customizations that are NOT specific to a particular API-level can go here. -->
    <item name="radio_button_style">@style/radioButtonStyle</item>
</style>
<style name="radioButtonStyle" parent="@android:style/Widget.CompoundButton.RadioButton">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">64dp</item>
    <item name="android:background">#000</item>
    <item name="android:button">@null</item>
    <item name="android:gravity">center</item>
    <item name="android:saveEnabled">false</item>
    <item name="android:textColor">@drawable/option_text_color</item>
    <item name="android:textSize">9sp</item>
</style>

শেষে, এটি ব্যবহার করুন!

            RadioButton radioButton = new RadioButton(mContext, null, R.attr.radio_button_style);

প্রোগ্রামাম্যাটিকভাবে তৈরি ভিউটি আপনার থিমে নির্দিষ্ট স্টাইল ব্যবহার করবে।

আপনি চেষ্টা করতে পারেন এবং আশা করি এটি আপনার পক্ষে নিখুঁতভাবে কাজ করতে পারে।


0

আমি কেবল এডিটেক্সট দিয়ে পরীক্ষা করেছি তবে আপনি পদ্ধতিটি ব্যবহার করতে পারেন

সার্বজনীন শূন্য সেটব্যাকগ্রাউন্ডআর রিসোর্স

একটি এক্সএমএল ফাইলে সংজ্ঞায়িত স্টাইল প্রয়োগ করতে।

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

শুভেচ্ছা।


ডকুমেন্টেশন অনুসারে এটি কেবল শৈলীর সাথে নয়, আঁকার সাথে কাজ করা উচিত। সুতরাং, যদি এটি সত্যিই কাজ করে তবে এটি কেবল "দুর্ঘটনাক্রমে" এবং আপনার উপর নির্ভর করা উচিত নয়।
হেইনজি

0

আমরা ব্যবহার করতে পারি TextViewCompact.setTextAppearance(textView, R.style.xyz)

রেফারেন্সের জন্য অ্যান্ড্রয়েড ডক

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