অ্যান্ড্রয়েড: প্রোগ্রাম শৈলীতে প্রদর্শন শৈলী সেট করুন


226

এখানে এক্সএমএল:

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    style="@style/LightStyle"
    android:layout_width="fill_parent"
    android:layout_height="55dip"
    android:clickable="true"
    android:orientation="horizontal" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal" />

</RelativeLayout>

styleপ্রোগ্রামেটিক্যালি কীভাবে অ্যাট্রিবিউট সেট করবেন ?


এখানে দেখুন ['প্রতিক্রিয়া'] [1], এটি আমার পক্ষে কাজ করেছে। [1]: stackoverflow.com/a/5488652/2938493
Artificioo

উত্তর:


211

প্রযুক্তিগতভাবে আপনি কাস্টম ভিউ সহ যে কোনও উপায়ে স্টাইলগুলি প্রোগ্রামিয়ালি প্রয়োগ করতে পারেন:

private MyRelativeLayout extends RelativeLayout {
  public MyRelativeLayout(Context context) {
     super(context, null, R.style.LightStyle);
  }
}

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

সুতরাং এই নির্মাণকারীকে সুপারের শৃঙ্খল করুন যা স্টাইলের প্যারামিটার নেয়।

RelativeLayout someLayout = new MyRelativeLayout(new ContextThemeWrapper(this,R.style.RadioButton));

অথবা @ ডরি যেমন সরলভাবে নির্দেশ করেছেন:

RelativeLayout someLayout = new RelativeLayout(new ContextThemeWrapper(activity,R.style.LightStyle));

34
আপনি ঠিক যেমন 3 ARG কন্সট্রাকটর কোন উপায়ে সর্বজনীন programatically ব্যাপ্ত ছাড়া এই কাজ করতে পারে developer.android.com/reference/android/widget/... , android.util.AttributeSet, int-)
Dori

1
@Turbo, উভয় দস্তাবেজ এবং অন্ধকার আপনি যে বলতে হবে: http://developer.android.com/reference/android/widget/LinearLayout.html#LinearLayout(android.content.Context, android.util.AttributeSet, int)। লিনিয়ারলআউট স্তর সহ 11+ প্রয়োজনীয়।
ওয়ান

2
@ দরি আপনি কি জন্য পাস করবেন AttributeSet?
ব্লুন্ডেল

9
যদি এটি কোনও টেক্সটভিউ হয় তবে আপনাকে পাঠ্য (আকার, রঙ ইত্যাদি) প্রভাবিত করে এমন বৈশিষ্ট্যগুলির জন্য সেটটেক্সট অ্যাপিয়েন্স (R.style.small_text) ব্যবহার করতে হবে
ম্যারাগিউস

2
তৃতীয়-তর্কের দৃষ্টিভঙ্গি কেন কাজ করে না তা আমার কোনও ধারণা নেই। আমি আবেদন করেছিলাম Button। @ বেঞ্জামিন পিট পদ্ধতিটি ঠিকঠাক কাজ করে।
ইয়াংজায়ে

124

আমার জন্য কী কাজ করেছে:

Button b = new Button(new ContextThemeWrapper(this, R.style.ButtonText), null, 0);
  • একটি কনটেক্সট থেমর্যাপার ব্যবহার করুন

এবং

  • 3-টি আর্গুমেন্ট কনস্ট্রাক্টর ব্যবহার করুন (এটি ছাড়া কাজ করবে না)

আপনার পদ্ধতিটি ব্যবহার করে কাজ করে তবে আমি ডাব্লু / রিসোর্স টাইপ get অনেকগুলি গুণাবলীর উল্লেখ পেয়েছি: 0x01010034 এ থামলাম stopped কোন কাজ?
হ্যালোমিডিয়াজ

আমি এই সমস্যাটি কখনও দেখিনি। এটি কোনও ডিভাইস-নির্দিষ্ট সমস্যা, বা সাম্প্রতিক অ্যান্ড্রয়েড সংস্করণ সম্পর্কিত কিছু হতে পারে?
বেনজামিন পিট

11
গুরুত্বপূর্ণ! এই পদ্ধতি আছে কাজ, কিন্তু স্টাইলিং সেট হবে যে শিশু দৃশ্য পাশাপাশি যদি ContextThemeWrapper সঙ্গে একটি নতুন লেআউট তৈরি করা।
aProperFox

@AProperFox আপনি আরও ভাল ব্যাখ্যা করতে পারেন? আমার সাথে কেবল একটি বোতামে যোগ করে কাজ করে। আপনি একটি লেআউট রেফারেন্স?
গিলিয়ান

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

88

আপডেট : এই প্রশ্নের উত্তর দেওয়ার সময় (২০১২ এর মাঝামাঝি, এপিআই স্তর 14-15), প্রোগ্রাম্যিকভাবে ভিউ সেট করা কোনও বিকল্প ছিল না (যদিও কিছু অ-তুচ্ছ কাজকর্ম ছিল) যদিও সাম্প্রতিকতম এপিআইয়ের পরে এটি সম্ভব হয়েছে রিলিজ। বিস্তারিত জানার জন্য @ ব্লুন্ডেলের উত্তর দেখুন।

পুরানো উত্তর:

আপনি এখনও প্রোগ্রামিয়ালি কোনও দৃশ্যের স্টাইল সেট করতে পারবেন না , তবে আপনি এই থ্রেডটিকে দরকারী বলে মনে করতে পারেন ।


16
সত্য না. @ ব্লুন্ডেলের উত্তর দেখুন।
a.bertucci

31
কিছু পরিস্থিতিতে (যেমন টেক্সটভিউ ব্যবহার করে) আপনি ব্যবহার করতে পারেন textView.setTextAppearance(context, R.style.mystyle);। দস্তাবেজের মতে "নির্দিষ্ট পাঠ্য প্রয়োগের সংস্থান থেকে পাঠ্যের রঙ, আকার, শৈলী, ইঙ্গিত রঙ এবং হাইলাইট রঙ সেট করে" " বিকাশকারী.অ্যান্ড্রয়েড.
রোজেল গার্সিয়া

4
এপিআই> 23; textView.setTextAppearance (R.style.mystyle);
অ্যালিকান akol

1
আমি এই উত্তরটি 4 বছর আগে @ হাইডেনকাই পোস্ট করেছি। এবং সেই থেকে প্রোগ্রামটিমেটিকভাবে স্টাইল প্রয়োগ করা সক্ষম করে এআইপিআই অনেক কিছু পরিবর্তন করেছে।
Korhan Ozturk

3
@ কোরহান ওজতুরক সম্মত হয়েছেন, তবে এই জাতীয় প্রশ্নগুলির সাথে ক্রিয়াকলাপ রয়েছে এমন প্রশ্ন নিয়ে প্রশ্নটি আবারও খোলার উচিত এবং একটি নতুন উত্তর গৃহীত হবে
হ্যাডেনকাই

16

একটি নতুন বোতাম / পাঠ্যদর্শন জন্য:

Button mMyButton = new Button(new ContextThemeWrapper(this, R.style.button_disabled), null, 0);

একটি বিদ্যমান উদাহরণের জন্য:

mMyButton.setTextAppearance(this, R.style.button_enabled);

চিত্র বা বিন্যাসের জন্য:

Image mMyImage = new ImageView(new ContextThemeWrapper(context, R.style.article_image), null, 0);

8

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

যেহেতু আপনি এক্সএমএল থেকে আপনার দৃষ্টি সঞ্চার করছেন আপনার লেআউটে কোনও আইডি নির্দিষ্ট করতে হবে:

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/my_styleable_relative_layout"
    style="@style/LightStyle"
    ...

তারপরে যখন আপনার বিন্যাসটি স্ফীত হওয়ার পরে প্রোগ্রামিয়ালি স্টাইলটি পরিবর্তন করা দরকার:

// Any way to get the view instance will do
RelativeLayout myView = findViewById(R.id.my_styleable_relative_layout);

// This will apply all the supported attribute values of the style
Paris.style(myView).apply(R.style.LightStyle);

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

দাবি অস্বীকার: আমি এই গ্রন্থাগারের মূল লেখক।


এটি কি এখনও 2019 সালে ব্যবহারের জন্য প্রস্তাবিত পদ্ধতির?
ইগোরগানাপলস্কি

1
@ ইগরগানাপলস্কি আফিক হ্যাঁ! আমি এর চেয়ে ভাল আর কিছু জানি না।
নথনেল

এই সমাধান সরবরাহ করার জন্য আপনাকে @ নাথানেলকে ধন্যবাদ সর্বশেষতম লাইন_উইট বৈশিষ্ট্য সহ এটির রক্ষণাবেক্ষণকারী হিসাবেও। ভাল কাজগুলো করতে থাকো! সত্যিই দরকারী।
গুইলেম রোকা

7

আপনি আপনার কার্যকলাপে একটি স্টাইল প্রয়োগ করতে পারেন:

super.setTheme( R.style.MyAppTheme );

বা অ্যান্ড্রয়েড ডিফল্ট:

super.setTheme( android.R.style.Theme );

আপনার ক্রিয়াকলাপে, আগে setContentView()


4
@ সিমিয়ান আপনি কি দয়া করে এফএমকে নির্দ্বিধায় প্রকাশ করতে দিতে পারেন? তার কোনও সম্পাদনার দরকার নেই!
মিকা

6

প্রদত্ত উত্তরগুলির মধ্যে সঠিক নয়।

আপনি প্রোগ্রাম শৈলী সেট করতে পারেন।

সংক্ষিপ্ত উত্তরটি একবার দেখুন:

দীর্ঘ উত্তর. কাস্টম সংজ্ঞায়িত স্টাইলটি আপনার ভিউটিতে প্রোগ্রাম্যাগ্যাটিকভাবে সেট করতে এখানে আমার স্নিপেটটি রয়েছে:

1) আপনার স্টাইল.এক্সএমএল ফাইলে একটি শৈলী তৈরি করুন

 <style name="MyStyle">
    <item name="customTextColor">#39445B</item>
    <item name="customDividerColor">#8D5AA8</item>
</style>

আপনার কাস্টম বৈশিষ্ট্যগুলি attrs.xML ফাইলটিতে সংজ্ঞা দিতে ভুলবেন না

আমার attrsl.xML ফাইল:

<declare-styleable name="CustomWidget">
    <attr name="customTextColor" format="color" />
    <attr name="customDividerColor" format="color" />
</declare-styleable>

লক্ষ্য করুন যে আপনি আপনার স্টাইলযোগ্য (আমার কাস্টম উইজেট) এর জন্য যে কোনও নাম ব্যবহার করতে পারেন

এখন শৈলীটি উইজেটের সাথে সেট করতে দিন প্রোগ্রামারিকভাবে এখানে আমার সাধারণ উইজেটটি রয়েছে:

public class StyleableWidget extends LinearLayout {

private final StyleLoader styleLoader = new StyleLoader();

private TextView textView;
private View divider;

public StyleableWidget(Context context) {
    super(context);
    init();
}

private void init() {
    inflate(getContext(), R.layout.widget_styleable, this);
    textView = (TextView) findViewById(R.id.text_view);
    divider = findViewById(R.id.divider);
    setOrientation(VERTICAL);
}

protected void apply(StyleLoader.StyleAttrs styleAttrs) {
    textView.setTextColor(styleAttrs.textColor);
    divider.setBackgroundColor(styleAttrs.dividerColor);
}

public void setStyle(@StyleRes int style) {
    apply(styleLoader.load(getContext(), style));
}
}

লেআউট:

<TextView
    android:id="@+id/text_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="22sp"
    android:layout_gravity="center"
    android:text="@string/styleble_title" />

<View
    android:id="@+id/divider"
    android:layout_width="match_parent"
    android:layout_height="1dp"/>

</merge>

এবং অবশেষে স্টাইললডার শ্রেণি প্রয়োগকরণ

public class StyleLoader {

public StyleLoader() {

}

public static class StyleAttrs {
    public int textColor;
    public int dividerColor;
}

public StyleAttrs load(Context context, @StyleRes int styleResId) {
    final TypedArray styledAttributes = context.obtainStyledAttributes(styleResId, R.styleable.CustomWidget);
    return load(styledAttributes);
}

@NonNull
private StyleAttrs load(TypedArray styledAttributes) {
    StyleAttrs styleAttrs = new StyleAttrs();
    try {
        styleAttrs.textColor = styledAttributes.getColor(R.styleable.CustomWidget_customTextColor, 0);
        styleAttrs.dividerColor = styledAttributes.getColor(R.styleable.CustomWidget_customDividerColor, 0);
    } finally {
        styledAttributes.recycle();
    }
    return styleAttrs;
}
}

আপনি https://github.com/Defuera/SetStylableProgramatic এ সম্পূর্ণরূপে কার্যকারী উদাহরণ খুঁজে পেতে পারেন


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

1
শৈলীগুলিতে কী প্রয়োগ করা হবে তা নির্দিষ্ট করে জানাতে আমার আপত্তি নেই, তবে এই সমাধানটিতে স্টাইলের উপাদানগুলি হার্ড-কোডেড রয়েছে (যেমন পাঠ্য রঙ এবং বিভাজক রঙ)। এটি গতিশীলভাবে শৈলীতে সংজ্ঞায়িত সমস্ত উপাদান খুঁজে পাবে না এবং এগুলি দর্শনে প্রয়োগ করবে।
nasch

আপনার পোস্ট করা লিঙ্কটি খোলে না। আপনি কি আবার পোস্ট করতে পারেন?
ইগোরগানাপলস্কি

4

এটি বেশ পুরানো প্রশ্ন তবে সমাধানটি এখন আমার পক্ষে কাজ করেছে কনস্ট্রাক্টরের ৪ র্থ প্যারামিটার ব্যবহার করা defStyleRes- যদি পাওয়া যায় .. ভিউতে ... শৈলী সেট করতে

আমার উদ্দেশ্য (কোটলিন) এর জন্য নিম্নলিখিত কাজগুলি:

val textView = TextView(context, null, 0, R.style.Headline1)

3

এটি আমার সহজ উদাহরণ, কীটি ContextThemeWrapperমোড়ক ছাড়া এটি ছাড়া আমার শৈলীটি কাজ করে না এবং তিনটি প্যারামিটার কনস্ট্রাক্টরটি ভিউ ব্যবহার করে।

ContextThemeWrapper themeContext = new ContextThemeWrapper(this, R.style.DefaultLabelStyle);
TextView tv = new TextView(themeContext, null, 0);
tv.setText("blah blah ...");
layout.addView(tv);

2

সহজ উপায়টি কনস্ট্রাক্টরের মধ্য দিয়ে যাচ্ছে

RadioButton radioButton = new RadioButton(this,null,R.style.radiobutton_material_quiz);

এই সমাধানটি কীভাবে ব্যবহার করবেন সে সম্পর্কে আরও কিছুটা উদাহরণ সহায়ক হবে।
ইগোরগানাপলস্কি

1

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

নির্দিষ্ট থিমটি বেস প্রসঙ্গে থিমের উপরে প্রয়োগ করা হবে।

আপনার আবেদনে কী অযাচিত ফলাফল করতে পারে। পরিবর্তে আমি এয়ারবিএনবির প্রকৌশলীদের কাছ থেকে এর জন্য নতুন লাইব্রেরি "প্যারিস" প্রস্তাব করছি:

https://github.com/airbnb/paris

প্রোগ্রামেটিকভাবে অ্যান্ড্রয়েড দর্শনে শৈলীর সংজ্ঞা দিন এবং প্রয়োগ করুন।

তবে এটি ব্যবহারের কিছু সময় পরে আমি জানতে পেরেছিলাম যে এটি আসলে বেশ সীমিত এবং আমি এটি ব্যবহার বন্ধ করে দিয়েছি কারণ এটি আমার বাইরে থাকা অনেকগুলি সম্পত্তি সমর্থন করে না, তাই একজনকে চেক আউট করতে হবে এবং যথারীতি সিদ্ধান্ত নিতে হবে।


আপনার ডাউনভোট বন্ধুটিকে ব্যাখ্যা করুন ... আমি এক থেকে দেড় দিন হেরে গিয়েছি কারণ আমি কনটেক্সট থেমর্যাপার ব্যবহার করেছি এবং এটি আমার প্রসঙ্গে থিম সাদা ব্যাকগ্রাউন্ডে প্রয়োগ হয়েছে, তারপরে হঠাৎ গুগল ম্যাটেরিয়াল লাইব্রেরির চিপ উইজেট ক্র্যাশ হচ্ছিল, কেন অনুমান করুন ...
রেনেতিক

প্যারিস লাইব্রেরি নীচে কনটেক্সট থেমর্যাপার ব্যবহার করে না ?
ইগোরগানাপলস্কি

@ ইগরগানাপলস্কি এটি করেন না। এটি এক্সএমএল স্টাইলটি পড়ে এবং ভিউতে এটি সম্পর্কিত পদ্ধতি কলগুলিতে রূপান্তর করে।
নথনেল

এটি আসলে বেশ সীমিত আমি এটি ব্যবহার বন্ধ করে দিয়েছি কারণ এটি আমার প্রয়োজনীয় প্রচুর সংখ্যক সমর্থন করে না ...
রিনিটিক

-1

আমি আমার সম্মিলিত ভিউগ্রুপে এক্সএমএলে সংজ্ঞায়িত মতামত ব্যবহার করেছি, তাদের ভিউগ্রুপে যুক্ত করেছি inf এইভাবে আমি গতিশীলভাবে স্টাইল পরিবর্তন করতে পারি না তবে আমি কিছু শৈলীর কাস্টমাইজেশন করতে পারি। আমার সম্মিলিত:

public class CalendarView extends LinearLayout {

private GridView mCalendarGrid;
private LinearLayout mActiveCalendars;

private CalendarAdapter calendarAdapter;

public CalendarView(Context context) {
    super(context);

}

public CalendarView(Context context, AttributeSet attrs) {
    super(context, attrs);

}

@Override
protected void onFinishInflate() {
    super.onFinishInflate();
    init();
}

private void init() {
    mCalendarGrid = (GridView) findViewById(R.id.calendarContents);
    mCalendarGrid.setNumColumns(CalendarAdapter.NUM_COLS);

    calendarAdapter = new CalendarAdapter(getContext());
    mCalendarGrid.setAdapter(calendarAdapter);
    mActiveCalendars = (LinearLayout) findViewById(R.id.calendarFooter);
}

}

এবং এক্সএমএলে আমার দৃষ্টিভঙ্গি যেখানে আমি শৈলীগুলি নির্ধারণ করতে পারি:

<com.mfitbs.android.calendar.CalendarView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/calendar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:orientation="vertical"
>

<GridView
    android:id="@+id/calendarContents"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

<LinearLayout
    android:id="@+id/calendarFooter"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    />


1
আপনি গতিশীলভাবে স্টাইলটি কোথায় স্থাপন করছেন?
ইগোরগানাপলস্কি

-3

আপনি পছন্দসই শৈলী সঙ্গে বিন্যাস ধারণকারী XML তৈরি করতে পারেন এবং তারপর আপনার ভিউ পটভূমিতে সম্পদ পরিবর্তন করেন, মত এই


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