كيفية إنشاء Android Spinner بدون مثلث أسفل على الجانب الأيمن من القطعة

StackOverflow https://stackoverflow.com/questions/4058360

سؤال

لدي شاشة حيث يكون للمستخدم العديد من العناصر التي يجب إدخالها بحيث تكون مساحة الشاشة قسطًا.

أريد أن يكون مظهر القطعة على الشاشة (قبل أن يضغط عليها المستخدم) مشابهاً لـ EditText أو الجزء الأيسر من عنصر واجهة المستخدم الدوار (بدون مثلث أسفل العادي) على الجانب الأيمن من الدوار. ثم عندما يضغط المستخدم على القطعة ، سيحصل على مربع حوار اختيار الدوار العادي.

هل هناك بعض سمة نمط الدوار يمكنني تغييرها لإنجاز هذا؟

لم أتمكن من رؤية رمز مثل هذا.

شكرًا

هل كانت مفيدة؟

المحلول

شيء واحد يمكنك القيام به هو أخذ Spinnerرمز المصدر من قاعدة رمز Android ، إلى جانب التخطيطات والموارد ذات الصلة ، واستخدمها لإنشاء عنصر واجهة المستخدم المخصصة الخاصة بك (ربما ستحتاج فقط إلى إزالة السهم من التخطيط وتعديل الكود اعتمادًا قليلاً على احتياجاتك).

تحرير: أنت على حق ، بعد هذا المنشور ، كان الأمر بسيطًا حقًا :) عليك أن تفعل شيئين. أولاً ، قم بإنشاء ملف styles.xml تحت الدقة/القيم ، افتحه وأضف ما يلي:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style parent="@android:style/Widget.Spinner" name="SpinnerAsEditText">
        <item name="android:background">@android:drawable/edit_text</item>
    </style>
</resources>

بعد ذلك ، في تخطيطك ، أضف الدوار مثل هذا:

<Spinner style="@style/SpinnerAsEditText" anyOtherAttributeYouNeed="..."></Spinner>

هذا كل شيء ، الآن سيبدو الدوار وكأنه edittext عادي ، دون هذا السهم غير المعتاد والمزعج.

نصائح أخرى

هذا سؤال قديم تمامًا ، لكنني أعتقد أنه لا يزال ذا صلة ، لذلك ها هو إجابتي:

أبسط طريقة

إجابة Lencinhaus صحيحة. إنه يعمل ، ولكن يمكن القيام به بطريقة أبسط: فقط أضف خلفية أخرى لها. المثال أدناه يستخدم المعيار Button خلفية لدراسة أكثر تجانسًا:

<Spinner
    android:id="@+id/my_spinner"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:prompt="@string/my_prompt" 
    android:background="@android:drawable/btn_default"
    />       

Syle المستخدمة في الإجابة الأخرى لا أكثر من تطبيق خلفية على القطعة. يمكن القيام بذلك مباشرة إلى القطعة ، مع توفير الحاجة إلى ملف XML جديد. بالطبع ، إذا كنت ستطبق أسلوبًا على الدوار على أي حال ، فلا حرج في هذا النهج.

لماذا ا؟

يكمن مفتاح فهم كيفية عمله في وصف PNG 9-Patch. يتم استخدام الخطوط الموجودة على اليمين وفي الأسفل للحشوة ، أي للحفاظ على بعض المساحة من استخدامها بواسطة محتواه. في هذه الحالة ، النص في الداخل. تستخدم خلفية الدوار القياسية صورة مع سهم على اليمين خارج منطقة النص القابلة للاستخدام. انظر الشكل 1 أدناه للحصول على توضيح:

الشكل 1. SPINNER BACGROUNG 9-PATCH PNG http://tinypic.com/images/404.gif
الشكل 1. الأصلي Spinner Bacground 9-Patch PNG.

مجرد إزالة السهم لا يكفي لأن الحشو يبقى هناك. تحتاج إلى استخدام صورة جديدة مكونة من 9 نقاط مع انخفاض حشوة (انظر الشكل 2 للحصول على مثال على أساس الشكل 1) أو استخدم إحدى الصور المسبقة المسبقة دون الكثير EditText (@android:drawable/edit_text) أو Button (@android:drawable/btn_default).

Figure 2. Modified Spinner bacground 9-patch PNG with reduced padding
الشكل 2. تعديل Spinner Bacground 9-Patch PNG مع انخفاض الحشو.

إن فهم هذا سيتيح لك إنشاء خلفياتك الخاصة Spinner (وفي الواقع ، لأي عنصر واجهة مستخدم).

تفسير أفضل لملفات 9-patch يمكن العثور عليها هنا

من السهل جدًا إنشاء الملفات مع Draw9patch قابلة للتنفيذ من SDK (اقرأ عنها هنا) ، لكن لا شيء يمنعك من الاستخدام محل تصوير أو gimp في حين أن. تذكر أن PNGs 9 patch هي مجرد PNGs عادي! التحذير الوحيد هو التأكد من أنك ترسم فقط إلى الخطوط الخارجية للبكسل وأن بقية البكسلات شفافة تمامًا. قد ينتج عن مضادات الحدود بالقرب من الحدود نتائج غير متوقعة.

لقد وصلت للتو إلى هذا السؤال ، لأن الدوار الخاص بي لم يكن يعرض مؤشر المثلث ، والآن أفهم لماذا: كنت أقوم بتعيين الخلفية على "الأبيض":

android:background="#FFFFFFFF"

هذا يزيل مؤشر المثلث (صورة خلفية الدوار والحشو التي ذكرها Aleadam).

بالنسبة لمشكلتي ، أقوم بحلها لإضافة linearlayout الوالدين فقط لتعيين الخلفية على "الأبيض".

امنحها خلفية ، سوف يختفي السهم.

android:background="@drawable/bg"

كنت أواجه نفس المشكلة وغيرت الأسلوب إلى:

style="@style/Widget.AppCompat.Light.DropDownItem.Spinner"

وعملت.

كم هو غريب ، يقع في DropDownItem.

في حين أن واحد الذي لديه المثلث السفلي يسمى الطبيعي.

هتافات!

في إصدار المساحة ذات الصلة التي يتم أخذها عند النقر على Spinner فعليًا ، وجدت عن طريق الصدفة أنه يمكنك إزالة مؤشرات التحديد الكبيرة هذه على اليمين. يمكنك الحصول على قائمة أساسية مفصولة بخطوط ولكن يمكنك النقر فوق عنصر ولا يزال يعمل.

قم بإعداد دوار مثل هذا للحصول على مؤشرات الاختيار:

    Spinner s1 = (Spinner) findViewById(R.id.spinner1);
    ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(
            this, R.array.petals, android.R.layout.simple_spinner_item);
    adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    s1.setAdapter(adapter1);

بدون أي مؤشرات ، فقط اترك خط setDropDownViewResource.

لماذا لا تذهب لحوار مع القائمة. وفقًا لمتطلباتك ، قم بإنشاء حقل EditText ، وأضف SetOnfocusChangelistener ثم عرض حوار مع عناصر قائمة في طريقة OnFocusChange (). لحوار مع عناصر القائمة

new AlertDialog.Builder(this)
                .setTitle("<Title>")
                .setItems(R.array.<ItemsArrayName>, new DialogInterface.OnClickListener(){
     @Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub  
}}).show();

لم تكن هناك إجابة مفيدة بالنسبة لي ، لذا فإليك حلًا بسيطًا من الخط واحد يعمل.

  //some spinner initialisation stuff->
mySpinner.setAdapter(adapter);

  //some spinner initialisation stuff->
mySpinner.getBackground().setColorFilter(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);

لا يمكنني معرفة ما إذا كان سيعمل مع تخطيط الدوار الافتراضي ، لكنه نجح بشكل جيد مع العرف الذي أنشأته لتلبية الاحتياجات الأخرى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top