View Full Version : اسپینر Spinner
sobhan1990
سه شنبه 17 اردیبهشت 1392, 19:18 عصر
سلام
چطور میشه داده های Spinner رو فارسی نوشت؟
از کلاس PersianReshape.java هم استفاده کردم ولی جواب نداد.
با تشکر
Modernidea
چهارشنبه 18 اردیبهشت 1392, 11:12 صبح
سلام
کدی که در این مورد نوشتید را اینجا قرار بدید تا مشکل را باهم حل کنیم.
موفق باشید.
sobhan1990
چهارشنبه 18 اردیبهشت 1392, 11:23 صبح
سلام
کدم اینه:
List<String> list = new ArrayList<String>();
item1 = "آیتم یک";
item2 = "آیتم دو";
item3 = "آیتم سه";
list.add(PersianReshape.reshape(item1));
list.add(PersianReshape.reshape(item2));
list.add(PersianReshape.reshape(item3));
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, list);
dataAdapter.setDropDownViewResource(android.R.layo ut.simple_spinner_dropdown_item);
spinn.setAdapter(dataAdapter);
Modernidea
چهارشنبه 18 اردیبهشت 1392, 23:32 عصر
سلام
کدتون نباید مشکلی داشته باشه!
من از یک کلاس دیگر جهت فارسی نویسی برای همین کدی که قرار دادید استفاده کردم و جواب داد!
تا حالا از PersianReshape استفاده نکردم!
کلاسی که ضمیمه کردم را به پروژه اضافه کنید و طبق مثال زیر ازش استفاد کنید ببنید مشکل حل میشه؟
List<String> list = new ArrayList<String>();
String item1 = "آیتم یک";
String item2 = "آیتم دو";
String item3 = "آیتم سه";
list.add(Farsi.Convert(item1));
list.add(Farsi.Convert(item2));
list.add(Farsi.Convert(item3));
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, list);
dataAdapter.setDropDownViewResource(android.R.layo ut.simple_spinner_dropdown_item);
Spinner sp = (Spinner)findViewById(R.id.spinner);
sp.setAdapter(dataAdapter) ;
درضمن، بهتره که برای آبجکت هایی که متن های فارسی نمایش میدن، علاوه بر استفاده از تبدیل فارسی، از فونت هم استفاده کنید تا مشکلات فارسی ممکن، احتمال رخ دادنش کمتر بشه.
برای اینکه به Spinner فونت انتصاب بدیم لازم هست که چند کار کوچک را انجام بدیم:
1- ساخت یک Layout که شامل آیتم های هر سطر از Spinner است.
2- ایجاد یک کلاس از نوع Array Adapter و override کردن متدهای getView and getDropDownView و انجام امور مربوط به تبدیل فارسی در این دو متد.
3- انتصاب Adapter به Spinner
1- ساخت یک Layout که شامل آیتم های هر سطر از Spinner است:
در واقع یک فایل xml است که فقط شامل یک TextView است. این TextView همان سطر Spinner ماست.
<?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:id="@+id/textView"
android:textSize="20dp"
android:textStyle="bold"
android:textColor="@android:color/black"/>
2- ایجاد یک کلاس از نوع Array Adapter و override کردن متدهای getView و getDropDownView و انجام امور مربوط به تبدیل فارسی در این دو متد.
package com.example.test;
import android.content.Context;
import android.graphics.Typeface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import com.example.test.farsi.Farsi;
import java.util.List;
/**
* User: Behzad
* Date: 5/8/13
* Time: 10:47 PM
*/
public class YourItemAdapter extends ArrayAdapter {
Typeface tf;
List<String> _list;
Context context;
LayoutInflater mInflater;
public YourItemAdapter(Context _context, int _resource, List<String> _items) {
super(_context, _resource, _items);
this.context = _context;
this.tf = Typeface.createFromAsset(_context.getAssets(),"font/BZar.ttf");
this._list = _items;
this.mInflater = LayoutInflater.from(context);
}
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = mInflater;
View row = inflater.inflate(R.layout.spinner_layout, parent,
false);
TextView v = (TextView) row.findViewById(R.id.textView);
v.setTypeface(tf);
v.setText(Farsi.Convert(_list.get(position)));
return row;
}
public View getDropDownView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = mInflater;
View row = inflater.inflate(R.layout.spinner_layout, parent,
false);
TextView v = (TextView) row.findViewById(R.id.textView);
v.setTypeface(tf);
v.setText(Farsi.Convert(_list.get(position)));
return row;
}
}
3- انتصاب Adapter به Spinner
package com.example.test;
import android.app.Activity;
import android.graphics.Typeface;
import android.os.Bundle;
import android.widget.Spinner;
import java.util.ArrayList;
import java.util.List;
public class MyActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
List<String> list = new ArrayList<String>();
String item1 = "آیتم یک";
String item2 = "آیتم دو";
String item3 = "آیتم سه";
list.add(item1);
list.add(item2);
list.add(item3);
YourItemAdapter ad = new YourItemAdapter(getApplicationContext(), 0, list);
Spinner sp = (Spinner)findViewById(R.id.spinner);
sp.setAdapter(ad);
}
}
پوشه فونت ضمیمه شده را در پوشه assets قرار بدید.
منابع:
http://stackoverflow.com/questions/3901231/how-to-change-font-style-for-spinner-item
http://stackoverflow.com/questions/12599703/custom-spinner-adapter
stackoverflow.com/questions/5483495/how-to-set-font-custom-font-to-spinner-text-programmatically
موفق باشید.
mahdi1373
پنج شنبه 19 اردیبهشت 1392, 00:05 صبح
مشکلتون چیه؟ حروف جدا نشون داده میشه یا اصلا نشون داده نمیشه یا...
میتونید اگر ناچار شدید از ArrayAdapter خودتون استفاده کنید. مثلا یه کلاس بنویسید و از ArrayAdapter ارث ببرید. یا اینکه از view خودتون استفاده کنید.
sobhan1990
پنج شنبه 19 اردیبهشت 1392, 22:01 عصر
سلام
ممنونم از راهنمایی کامل شما
مشکل فارسی حل شد ولی شکل ظاهری اسپین یکمی از بد ریخت شده. عکسش رو ضمیمه کردم.
راهی هست که ظاهرش شبیه همون ظاهری در حالت انگلیسی بشه؟
با تشکر
mahdi1373
پنج شنبه 19 اردیبهشت 1392, 23:34 عصر
بجای اون layout که الان استفاده می کنی، یک فایل xml تو layout هات بساز، توش یه textView بذار و textColor اش رو عوض کن. از اون استفاده کن.
Modernidea
جمعه 20 اردیبهشت 1392, 02:19 صبح
سلام
همینجور که دوستمون گفتند، باید Layout را بسته به سلیقه خودتون طراحی کنید.
مثلا این یک نمونش هست که نزدیک به ظاهر اصلی است:
<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/textView"
android:drawableLeft="?android:attr/listChoiceIndicatorSingle"
android:gravity="right|center_vertical"
android:singleLine="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingRight="10dp"
android:textColor="@android:color/black"
android:ellipsize="marquee" />
موفق باشید.
zahra.mf
پنج شنبه 07 شهریور 1392, 10:38 صبح
سلام
میشه بگید چه جوری میشه روی هر آیتم که کلیک میکنم یه کاری انجام بده
Modernidea
پنج شنبه 07 شهریور 1392, 14:15 عصر
سلام
میشه بگید چه جوری میشه روی هر آیتم که کلیک میکنم یه کاری انجام بده
سلام
عذر خواهی میکنم به علت کمبود وقت نمیتونم کامل توضیح بدم.
لینکی در این مورد قرار میدم و امیدوارم که مشکلتان را حل کند.
http://stackoverflow.com/a/1714426/478162
موفق باشید
zahra.mf
پنج شنبه 07 شهریور 1392, 18:23 عصر
من میخوام هر کدوم از موارد spinner که انتخاب میشه یکی از فونت ها که تو پوشه asset هستن انتخاب بشه
من این کار و اول با radioButton انجام میدادم و کار هم میکرد شرط داخل case و مثل همون نوشتم قبل اینکه switch بذارم وقتی رو دکمه تنظیمات کلیک میکردم xml مربوط به spinner نشون داده میشد ولی وقتی switch گذاشتم رو دکمه که کلیک میکنم هیچی نمیشه
sp.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View selectedItemView,
int position, long id) {
// TODO Auto-generated method stub
switch(position)
{
case 0: font="tahoma.ttf";
finish();
break;
case 1:font="QuranTaha.ttf";
finish();
break;
}
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
});
Modernidea
جمعه 08 شهریور 1392, 20:25 عصر
یعنی اگر شما بخش کد مربوط به Switch را پاک کنید، اکتیویتی مربوط به Spinner نمایش داده میشود؟!
zahra.mf
جمعه 08 شهریور 1392, 21:14 عصر
یعنی اگر شما بخش کد مربوط به Switch را پاک کنید، اکتیویتی مربوط به Spinner نمایش داده میشود؟!
بله وقتی پاک میکنم switch و اکتیویتی نمایش داده میشه!!
Modernidea
جمعه 08 شهریور 1392, 23:42 عصر
این کد را تست کنید ببنید درست میشه:
boolean selected = false;
switch(position)
{
case 0:
font="tahoma.ttf";
selected = true;
break;
case 1:
font="QuranTaha.ttf";
selected = true;
break;
default:
break;
}
if(selected)
finish();
zahra.mf
شنبه 09 شهریور 1392, 12:11 عصر
نه بازم نشد:گریه:
دستور switch و که میذارم خطا نمیده حتی force stop هم نداره فقط button و که کلیک میکنم تا اکتیویتی اسپینر بالا بیاد هیچی نمیشه!
Modernidea
یک شنبه 10 شهریور 1392, 23:01 عصر
سلام
برنامه را debug کنید و یا در مراحل مختلف از LogCat استفاده کنید ببنید چرا اجرا نمیشه.
موفق باشید
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.