ইন্ট্রো
দুর্ভাগ্যক্রমে SearchView
XML এ থিম, শৈলী এবং উত্তরাধিকার ব্যবহার করে পাঠ্য ক্ষেত্র শৈলীর সেট করার কোনও উপায় নেই কারণ আপনি অ্যাকশনবারের ড্রপডাউন-এ আইটেমগুলির পটভূমি নিয়ে করতে পারেন । এটি কারণ selectableItemBackground
স্টাইলযোগ্য হিসাবে তালিকাভুক্ত করা হয়েছে R.stylable
, যদিও searchViewTextField
(থিম বৈশিষ্ট্য যা আমরা আগ্রহী) এটি নয়। সুতরাং, আমরা এক্সএমএল সংস্থানগুলির মধ্যে থেকে সহজেই এটি অ্যাক্সেস করতে পারি না (আপনি একটি No resource found that matches the given name: attr 'android:searchViewTextField'
ত্রুটি পাবেন)।
কোড থেকে অনুসন্ধানভিউ পাঠ্যের ক্ষেত্রের ব্যাকগ্রাউন্ড সেট করা হচ্ছে
সুতরাং, SearchView
পাঠ্য ক্ষেত্রের পটভূমিকে সঠিকভাবে প্রতিস্থাপনের একমাত্র উপায় হ'ল এটির অভ্যন্তরীণ অংশে প্রবেশ করা, সেই ভিত্তিতে ব্যাকগ্রাউন্ড সেট রয়েছে এমন দেখার অ্যাক্সেস অর্জন searchViewTextField
এবং আমাদের নিজস্ব সেট করা।
দ্রষ্টব্য: নীচের সমাধানটি কেবলমাত্র আইডি ( android:id/search_plate
) এর মধ্যে থাকা উপাদানগুলির উপর নির্ভর করে SearchView
, তাই এটি শিশুদের ট্র্যাভারসাল (যেমন searchView.getChildAt(0)
অভ্যন্তরীণ ডানদিকের দিকে যেতে ব্যবহার করে) এর চেয়ে বেশি এসডিকে-সংস্করণে স্বাধীন SearchView
, তবে এটি বুলেট-প্রুফ নয়। বিশেষত যদি কিছু নির্মাতা SearchView
উপরোক্ত আইডি সহ অভ্যন্তরীণ এবং উপাদানগুলির পুনরায় সংশোধন করার সিদ্ধান্ত নেয় তবে কোডটি কাজ করবে না।
এসডিকে, পাঠ্য ক্ষেত্রের জন্য পটভূমিটি নয়টি প্যাচগুলিরSearchView
মাধ্যমে ঘোষণা করা হয় , সুতরাং আমরা এটি একইভাবে করব। আপনি মূল জানতে পারেন PNG চিত্র অঙ্কনযোগ্য-mdpi নির্দেশিকা অ্যান্ড্রয়েড Git সংগ্রহস্থলের । আমরা দুটি ছবিতে আগ্রহী। যখন টেক্সট ক্ষেত্রের নির্বাচন করা হয় রাষ্ট্রের জন্য ওয়ান (নামে textfield_search_selected_holo_light.9.png ) এবং যেখানে এটি (নামে না জন্য এক textfield_search_default_holo_light.9.png )।
দুর্ভাগ্যক্রমে, আপনি উভয় চিত্রের স্থানীয় অনুলিপি তৈরি করতে হবে, এমনকি আপনি যদি কেবলমাত্র দৃষ্টি নিবদ্ধ করা স্থিতি কাস্টমাইজ করতে চান । এটি হ'ল আরডিড্রাব্যতেtextfield_search_default_holo_light
উপস্থিত নেই । সুতরাং এটির মাধ্যমে সহজেই অ্যাক্সেসযোগ্য নয় , যা স্থানীয় অঙ্কনযোগ্য উল্লেখ করার পরিবর্তে নীচে প্রদর্শিত নির্বাচকগুলিতে ব্যবহার করা যেতে পারে।@android:drawable/textfield_search_default_holo_light
দ্রষ্টব্য: আমি বেস হিসাবে হালো লাইট থিমটি ব্যবহার করছিলাম তবে আপনি হলো ডার্কের সাথেও এটি করতে পারেন । দেখে মনে হচ্ছে হালকা এবং গা ark ় থিমের মধ্যে নির্বাচিত রাষ্ট্র 9-প্যাচগুলির মধ্যে কোনও আসল পার্থক্য নেই । তবে, ডিফল্ট অবস্থার জন্য 9-প্যাচগুলির মধ্যে পার্থক্য রয়েছে ( হালকা বনাম গা ark ় দেখুন )। সুতরাং, সম্ভবত অন্ধকার এবং হালকা উভয় থিমের জন্য নির্বাচিত রাষ্ট্রের জন্য 9-প্যাচের স্থানীয় অনুলিপিগুলি তৈরি করার প্রয়োজন নেই (ধরে নিই যে আপনি উভয়কেই পরিচালনা করতে চান এবং সেগুলি উভয়কে হোলো থিমের মতো দেখায় )। কেবল একটি স্থানীয় অনুলিপি তৈরি করুন এবং এটি ব্যবহার করুনউভয় থিমের জন্য নির্বাচক অঙ্কনযোগ্য ।
এখন, আপনাকে আপনার প্রয়োজন অনুসারে নয়টি প্যাচ ডাউনলোড করতে হবে (যেমন নীল রঙকে লাল রঙে পরিবর্তন করা)। আপনার সম্পাদনার পরে সঠিকভাবে সংজ্ঞায়িত করা হয়েছে কিনা তা পরীক্ষা করতে আপনি 9-প্যাচ টুলটি ড্র করে ফাইলটি একবার দেখে নিতে পারেন ।
আমি ওয়ান-পিক্সেল পেনসিল সরঞ্জাম (বেশ সহজ) দিয়ে জিম্প ব্যবহার করে ফাইলগুলি সম্পাদনা করেছি তবে আপনি সম্ভবত নিজের সরঞ্জামটি ব্যবহার করবেন। ফোকাসড স্টেটের জন্য এখানে আমার কাস্টমাইজড 9-প্যাচ রয়েছে :
বিঃদ্রঃ: সরলতার জন্য, আমি কেবলমাত্র এমডিপিআই ঘনত্বের জন্য চিত্রগুলি ব্যবহার করেছি । আপনি যদি কোনও ডিভাইসে সেরা ফলাফল চান তবে একাধিক স্ক্রিন ঘনত্বের জন্য আপনাকে 9-প্যাচ তৈরি করতে হবে । জন্য চিত্র হোলো SearchView
খুঁজে পাওয়া যেতে পারে mdpi , hdpi এবং xhdpi অঙ্কনযোগ্য।
এখন, আমাদের আঁকার যোগ্য নির্বাচনকারী তৈরি করতে হবে, যাতে দৃশ্যের ভিত্তিতে সঠিক চিত্র প্রদর্শিত হবে। res/drawable/texfield_searchview_holo_light.xml
নিম্নলিখিত বিষয়বস্তু সহ ফাইল তৈরি করুন :
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true"
android:drawable="@drawable/textfield_search_selected_holo_light" />
<item android:drawable="@drawable/textfield_search_default_holo_light" />
</selector>
আমরা উপরের তৈরি অঙ্কনযোগ্য ব্যবহারের জন্য পঠন LinearLayout
ক্ষেত্রটি ধারণ করে এমন দৃশ্যের জন্য ব্যাকগ্রাউন্ড সেট করতে পারি SearchView
- এটির আইডি android:id/search_plate
। বিকল্পগুলির মেনু তৈরি করার সময় কোডে এটি কীভাবে করা যায় তা এখানে রয়েছে:
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
// Getting SearchView from XML layout by id defined there - my_search_view in this case
SearchView searchView = (SearchView) menu.findItem(R.id.my_search_view).getActionView();
// Getting id for 'search_plate' - the id is part of generate R file,
// so we have to get id on runtime.
int searchPlateId = searchView.getContext().getResources().getIdentifier("android:id/search_plate", null, null);
// Getting the 'search_plate' LinearLayout.
View searchPlate = searchView.findViewById(searchPlateId);
// Setting background of 'search_plate' to earlier defined drawable.
searchPlate.setBackgroundResource(R.drawable.textfield_searchview_holo_light);
return super.onCreateOptionsMenu(menu);
}
}
চূড়ান্ত প্রভাব
চূড়ান্ত ফলাফলের স্ক্রিনশটটি এখানে:
আমি এই কিভাবে পেলাম
আমি মনে করি যে এটি কীভাবে আমি পেয়েছি তা উল্লেখ করার মতো, যাতে অন্য মতামতগুলি কাস্টমাইজ করার সময় এই পদ্ধতির ব্যবহার করা যায়।
ভিউ লেআউটটি পরীক্ষা করা হচ্ছে
আমি কিভাবে পরীক্ষা করেছি SearchView
লেআউট দেখতে কেমন । ইন SearchView contructor এক একটি লাইন যে বাড়িয়ে বিন্যাস পেতে পারবেন:
inflater.inflate(R.layout.search_view, this, true);
এখন আমরা জানি যে SearchView
বিন্যাস নামের ফাইল রয়েছে res/layout/search_view.xml
। মধ্যে খুঁজছেন search_view.xml আমরা একটি ভেতরের জানতে পারেন LinearLayout
উপাদান (আইডি সহ search_plate
) আছে যে android.widget.SearchView$SearchAutoComplete
এটা ভিতরে (আমাদের মতো সৌন্দর্য অনুসন্ধান দর্শন টেক্সট ক্ষেত্রের):
<LinearLayout
android:id="@+id/search_plate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="center_vertical"
android:orientation="horizontal"
android:background="?android:attr/searchViewTextField">
এখন, আমরা এখন যে থিমটির searchViewTextField
বৈশিষ্ট্যের উপর ভিত্তি করে পটভূমি সেট করা আছে।
তদন্তের বৈশিষ্ট্য (এটি কি সহজে নিষ্পত্তিযোগ্য?)
কীভাবে searchViewTextField
অ্যাট্রিবিউট সেট করা আছে তা পরীক্ষা করতে , আমরা res / মান / থিমস.এমএমএল অনুসন্ধান করি । এর সাথে সম্পর্কিত একটি গ্রুপ রয়েছেSearchView
ডিফল্ট Theme
:
<style name="Theme">
<!-- (...other attributes present here...) -->
<!-- SearchView attributes -->
<item name="searchDropdownBackground">@android:drawable/spinner_dropdown_background</item>
<item name="searchViewTextField">@drawable/textfield_searchview_holo_dark</item>
<item name="searchViewTextFieldRight">@drawable/textfield_searchview_right_holo_dark</item>
<item name="searchViewCloseIcon">@android:drawable/ic_clear</item>
<item name="searchViewSearchIcon">@android:drawable/ic_search</item>
<item name="searchViewGoIcon">@android:drawable/ic_go</item>
<item name="searchViewVoiceIcon">@android:drawable/ic_voice_search</item>
<item name="searchViewEditQuery">@android:drawable/ic_commit_search_api_holo_dark</item>
<item name="searchViewEditQueryBackground">?attr/selectableItemBackground</item>
আমরা দেখতে পাচ্ছি ডিফল্ট থিমের জন্য মানটি @drawable/textfield_searchview_holo_dark
। জন্যTheme.Light
মান যে ফাইলে সেট করা হয় ।
এখন, দুর্দান্ত লাগবে যদি এই বৈশিষ্ট্যটি আর.স্টাইলযোগ্যের মাধ্যমে অ্যাক্সেসযোগ্য ছিল , তবে, দুর্ভাগ্যক্রমে এটি তা নয়। তুলনা করার জন্য, থিম.এক্সএমএল এবং আর.আর্ট্রির মতো পাঠ্য চেহারা বা নির্বাচনযোগ্য আইটেমব্যাকগ্রাউন্ড উভয়ই উপস্থিত থিমের অন্যান্য বৈশিষ্ট্যগুলি দেখুন । যদি উপস্থিত থাকতেন (এবংsearchViewTextField
R.attr
R.stylable
) যখন XML- এর আমাদের পুরো অ্যাপ্লিকেশনের জন্য থিম সংজ্ঞায়িত কেবলমাত্র আমরা আমাদের অঙ্কনযোগ্য নির্বাচক ব্যবহার করতে পারে। উদাহরণ স্বরূপ:
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="AppTheme" parent="android:Theme.Light">
<item name="android:searchViewTextField">@drawable/textfield_searchview_holo_light</item>
</style>
</resources>
কী পরিবর্তন করা উচিত?
এখন আমরা জানি, আমাদের search_plate
কোডের মাধ্যমে অ্যাক্সেস করতে হবে । তবে এটি দেখতে কেমন হবে তা আমরা এখনও জানি না। সংক্ষেপে, আমরা ডিফল্ট থিমগুলিতে মান হিসাবে ব্যবহৃত অঙ্কনগুলির জন্য অনুসন্ধান করি: টেক্সটফিল্ড_সার্চভিউ_হলো_ডার্ক.এক্সএমএল এবং টেক্সটফিল্ড_সার্চভিউ_হোলো_লাইট.এক্সএমএল । বিষয়বস্তুর দিকে তাকিয়ে আমরা দেখতে পেলাম যে আঁকাগুলি হ'ল selector
স্থিতির ভিত্তিতে অন্য দুটি আঁকাগুলি (যা পরে 9-প্যাচ হতে পারে) reference আপনি androiddrawables.com এ অ্যান্ড্রয়েডের সমস্ত সংস্করণ (প্রায়) থেকে একত্রিত 9-প্যাচ আঁকতে পারেন
কাস্টমাইজ
আমরা 9-টি প্যাচের একটিতে নীল রেখাটি সনাক্ত করি , তাই আমরা এর স্থানীয় অনুলিপি তৈরি করি এবং পছন্দমতো রঙ পরিবর্তন করি।