问题
I'm new in android. I used PersianReshape to change textview,button and ... so they are worked But i want to write persian for example in a toast or option menu and i dont know how ?
this is partial of my cod that worked for button and text view
Button b = (Button) findViewById(R.id.button1);
TextView tv =(TextView) findViewById(R.id.textView1);
PersianReshape.ReshapeButton(b, "Tannaz.ttf", MainActivity.this);
PersianReshape.ReshapeTextview(tv, "Tannaz.ttf", MainActivity.this);
回答1:
- Android 2.1 does not have Arabic font.
- Android 2.2 has Arabic font but does not show your word correctly.
- Android 3.x supports Arabic completely.
- For Android 2.1 you must set the typeface Farsi.GetFarsiFont(this) and then use Farsi.Convert("سلام")
- For Android 2.2 you do not need setting font but must use Farsi.Convert("سلام")
- And for Android 3.x forget all of the above solutions ;). But you can change the font if you do not like the 3.x Arabic font.
so do the following steps:
At first add "TAHOMA.TTF" in assets folder
use the following class to get the font and converting your Arabic or Farsi text to a good form for showing in your activities.
import android.content.Context; import android.graphics.Typeface; public class Farsi { public static boolean isFarsiConversionNeeded = true; private final static String szLamAndAlef = Character .toString((char) 0xfedf) + Character.toString((char) 0xfe8e); // Lam // + // Alef private final static String szLamStickAndAlef = Character .toString((char) 0xfee0) + Character.toString((char) 0xfe8e); // Lam // (Sticky // !!!)+ // Alef private final static String szLa = Character.toString((char) 0xfefb); // La private final static String szLaStick = Character.toString((char) 0xfefc); // La // (Sticky!!!) private final static String szLamAndAlefWoosim = Character .toString((char) 0xe1) + Character.toString((char) 0xbb); // Lam + // Alef private final static String szLamStickAndAlefWoosim = Character .toString((char) 0x90) + Character.toString((char) 0xbb); // Lam // (Sticky // !!!)+ // Alef private final static String szLaWoosim = Character.toString((char) 0xd9); // La private final static String szLaStickWoosim = Character .toString((char) 0xd9); // La // (Sticky!!!) private static final class struc { public char character; public char endGlyph; public char iniGlyph; public char midGlyph; public char isoGlyph; public struc(char Character, char EndGlyph, char IniGlyph, char MidGlyph, char IsoGlyph) { character = Character; endGlyph = EndGlyph; iniGlyph = IniGlyph; midGlyph = MidGlyph; isoGlyph = IsoGlyph; } } static struc[] arrStruc = { new struc((char) 0x630, (char) 0xfeac, (char) 0xfeab, (char) 0xfeac, (char) 0xfeab), new struc((char) 0x62f, (char) 0xfeaa, (char) 0xfea9, (char) 0xfeaa, (char) 0xfea9), new struc((char) 0x62c, (char) 0xfe9e, (char) 0xfe9f, (char) 0xfea0, (char) 0xfe9d), new struc((char) 0x62d, (char) 0xfea2, (char) 0xfea3, (char) 0xfea4, (char) 0xfea1), new struc((char) 0x62e, (char) 0xfea6, (char) 0xfea7, (char) 0xfea8, (char) 0xfea5), new struc((char) 0x647, (char) 0xfeea, (char) 0xfeeb, (char) 0xfeec, (char) 0xfee9), new struc((char) 0x639, (char) 0xfeca, (char) 0xfecb, (char) 0xfecc, (char) 0xfec9), new struc((char) 0x63a, (char) 0xfece, (char) 0xfecf, (char) 0xfed0, (char) 0xfecd), new struc((char) 0x641, (char) 0xfed2, (char) 0xfed3, (char) 0xfed4, (char) 0xfed1), new struc((char) 0x642, (char) 0xfed6, (char) 0xfed7, (char) 0xfed8, (char) 0xfed5), new struc((char) 0x62b, (char) 0xfe9a, (char) 0xfe9b, (char) 0xfe9c, (char) 0xfe99), new struc((char) 0x635, (char) 0xfeba, (char) 0xfebb, (char) 0xfebc, (char) 0xfeb9), new struc((char) 0x636, (char) 0xfebe, (char) 0xfebf, (char) 0xfec0, (char) 0xfebd), new struc((char) 0x637, (char) 0xfec2, (char) 0xfec3, (char) 0xfec4, (char) 0xfec1), new struc((char) 0x643, (char) 0xfeda, (char) 0xfedb, (char) 0xfedc, (char) 0xfed9), new struc((char) 0x645, (char) 0xfee2, (char) 0xfee3, (char) 0xfee4, (char) 0xfee1), new struc((char) 0x646, (char) 0xfee6, (char) 0xfee7, (char) 0xfee8, (char) 0xfee5), new struc((char) 0x62a, (char) 0xfe96, (char) 0xfe97, (char) 0xfe98, (char) 0xfe95), new struc((char) 0x627, (char) 0xfe8e, (char) 0xfe8d, (char) 0xfe8e, (char) 0xfe8d), new struc((char) 0x644, (char) 0xfede, (char) 0xfedf, (char) 0xfee0, (char) 0xfedd), new struc((char) 0x628, (char) 0xfe90, (char) 0xfe91, (char) 0xfe92, (char) 0xfe8f), new struc((char) 0x64a, (char) 0xfef2, (char) 0xfef3, (char) 0xfef4, (char) 0xfef1), new struc((char) 0x633, (char) 0xfeb2, (char) 0xfeb3, (char) 0xfeb4, (char) 0xfeb1), new struc((char) 0x634, (char) 0xfeb6, (char) 0xfeb7, (char) 0xfeb8, (char) 0xfeb5), new struc((char) 0x638, (char) 0xfec6, (char) 0xfec7, (char) 0xfec8, (char) 0xfec5), new struc((char) 0x632, (char) 0xfeb0, (char) 0xfeaf, (char) 0xfeb0, (char) 0xfeaf), new struc((char) 0x648, (char) 0xfeee, (char) 0xfeed, (char) 0xfeee, (char) 0xfeed), new struc((char) 0x629, (char) 0xfe94, (char) 0xfe93, (char) 0xfe93, (char) 0xfe93), new struc((char) 0x649, (char) 0xfef0, (char) 0xfeef, (char) 0xfef0, (char) 0xfeef), new struc((char) 0x631, (char) 0xfeae, (char) 0xfead, (char) 0xfeae, (char) 0xfead), new struc((char) 0x624, (char) 0xfe86, (char) 0xfe85, (char) 0xfe86, (char) 0xfe85), new struc((char) 0x621, (char) 0xfe80, (char) 0xfe80, (char) 0xfe80, (char) 0xfe80), new struc((char) 0x626, (char) 0xfe8a, (char) 0xfe8b, (char) 0xfe8c, (char) 0xfe89), new struc((char) 0x623, (char) 0xfe84, (char) 0xfe83, (char) 0xfe84, (char) 0xfe83), new struc((char) 0x622, (char) 0xfe82, (char) 0xfe81, (char) 0xfe82, (char) 0xfe81), new struc((char) 0x625, (char) 0xfe88, (char) 0xfe87, (char) 0xfe88, (char) 0xfe87), new struc((char) 0x67e, (char) 0xfb57, (char) 0xfb58, (char) 0xfb59, (char) 0xfb56), // peh new struc((char) 0x686, (char) 0xfb7b, (char) 0xfb7c, (char) 0xfb7d, (char) 0xfb7a), // cheh new struc((char) 0x698, (char) 0xfb8b, (char) 0xfb8a, (char) 0xfb8b, (char) 0xfb8a), // jeh new struc((char) 0x6a9, (char) 0xfb8f, (char) 0xfb90, (char) 0xfb91, (char) 0xfb8e), // keheh new struc((char) 0x6af, (char) 0xfb93, (char) 0xfb94, (char) 0xfb95, (char) 0xfb92), // gaf // new struc((char) 0x6cc, (char) 0xfbfd, (char) 0xfbfe, // (char) 0xfbff, (char) 0xfbfc), // Farsi yeh new struc((char) 0x6cc, (char) 0xfbfd, (char) 0xfef3, (char) 0xfef4, (char) 0xfbfc), // Arabic yeh new struc((char) 0x6c0, (char) 0xfba5, (char) 0xfba4, (char) 0xfba5, (char) 0xfba4) // heh with yeh }; static struc[] arrStrucWoosim = { new struc((char) 0x630, (char) 0xb5, (char) 0x82, (char) 0xb5, (char) 0x82), new struc((char) 0x62f, (char) 0xb4, (char) 0x81, (char) 0xb4, (char) 0x81), new struc((char) 0x62c, (char) 0x9b, (char) 0xb1, (char) 0xf9, (char) 0xbf), new struc((char) 0x62d, (char) 0x9c, (char) 0xb2, (char) 0xfa, (char) 0xc0), new struc((char) 0x62e, (char) 0x9d, (char) 0xb3, (char) 0xfe, (char) 0xc1), new struc((char) 0x647, (char) 0xac, (char) 0xe4, (char) 0x93, (char) 0xd5), new struc((char) 0x639, (char) 0xc9, (char) 0xd3, (char) 0x8b, (char) 0xa4), new struc((char) 0x63a, (char) 0xca, (char) 0xdd, (char) 0x8c, (char) 0xa5), new struc((char) 0x641, (char) 0xa6, (char) 0xde, (char) 0x8d, (char) 0xcc), new struc((char) 0x642, (char) 0xa7, (char) 0xdf, (char) 0x8e, (char) 0xce), new struc((char) 0x62b, (char) 0xbd, (char) 0xaf, (char) 0xea, (char) 0x99), new struc((char) 0x635, (char) 0xc4, (char) 0xc8, (char) 0x87, (char) 0xa0), new struc((char) 0x636, (char) 0xc5, (char) 0xcb, (char) 0x88, (char) 0xa1), new struc((char) 0x637, (char) 0xc6, (char) 0xcd, (char) 0xcd, (char) 0xa2), new struc((char) 0x643, (char) 0xcf, (char) 0xe0, (char) 0x8f, (char) 0xa8), new struc((char) 0x645, (char) 0xd2, (char) 0xe2, (char) 0x91, (char) 0xaa), new struc((char) 0x646, (char) 0xd4, (char) 0xe3, (char) 0x92, (char) 0xab), new struc((char) 0x62a, (char) 0xbd, (char) 0xaf, (char) 0xea, (char) 0x99), new struc((char) 0x627, (char) 0xbb, (char) 0x80, (char) 0xbb, (char) 0x80), new struc((char) 0x644, (char) 0xd1, (char) 0xe1, (char) 0x90, (char) 0xa9), new struc((char) 0x628, (char) 0xbc, (char) 0xae, (char) 0xe9, (char) 0x98), new struc((char) 0x64a, (char) 0xdc, (char) 0xe6, (char) 0x95, (char) 0xdc), new struc((char) 0x633, (char) 0xc2, (char) 0xb8, (char) 0xb8, (char) 0x9e), new struc((char) 0x634, (char) 0xc3, (char) 0xb9, (char) 0xb9, (char) 0x9f), new struc((char) 0x638, (char) 0xc7, (char) 0xcd, (char) 0xcd, (char) 0xc7), new struc((char) 0x632, (char) 0xb7, (char) 0xb7, (char) 0xb7, (char) 0xb7), new struc((char) 0x648, (char) 0x94, (char) 0x94, (char) 0x94, (char) 0x94), new struc((char) 0x629, (char) 0xda, (char) 0xda, (char) 0xda, (char) 0xda), new struc((char) 0x649, (char) 0xdc, (char) 0xe6, (char) 0x95, (char) 0xdc), new struc((char) 0x631, (char) 0xb6, (char) 0xb6, (char) 0xb6, (char) 0xb6), new struc((char) 0x624, (char) 0xe7, (char) 0xe7, (char) 0xe7, (char) 0xe7), new struc((char) 0x621, (char) 0xba, (char) 0xba, (char) 0xba, (char) 0xba), new struc((char) 0x626, (char) 0xd7, (char) 0xe8, (char) 0x97, (char) 0xd7), new struc((char) 0x623, (char) 0x80, (char) 0x80, (char) 0x80, (char) 0x80), new struc((char) 0x622, (char) 0x80, (char) 0x80, (char) 0x80, (char) 0x80), new struc((char) 0x625, (char) 0x80, (char) 0x80, (char) 0x80, (char) 0x80), new struc((char) 0x67e, (char) 0xbc, (char) 0xae, (char) 0xe9, (char) 0x98), // peh new struc((char) 0x686, (char) 0x9b, (char) 0xb1, (char) 0xf9, (char) 0xbf), // cheh new struc((char) 0x698, (char) 0xb7, (char) 0xb7, (char) 0xb7, (char) 0xb7), // jeh new struc((char) 0x6a9, (char) 0xcf, (char) 0xe0, (char) 0x8f, (char) 0xa8), // keheh new struc((char) 0x6af, (char) 0xcf, (char) 0xe0, (char) 0x8f, (char) 0xa8), // gaf new struc((char) 0x6cc, (char) 0xdc, (char) 0xe6, (char) 0x95, (char) 0xdc), // yeh new struc((char) 0x6c0, (char) 0xac, (char) 0xe4, (char) 0x93, (char) 0xd5) // heh with yeh }; private static final int N_DISTINCT_CHARACTERS = 43; private static final String ArabicReverse(String s) { try { String Out = "", rev; s = MakeReverse(s); char[] chs = new char[s.length()]; chs = s.toCharArray(); int i = 0; while (i < s.length()) { if ((chs[i] >= '0' && chs[i] <= '9')) // isDigit(s[i]) ? { rev = ""; while (i < s.length() && ((chs[i] >= '0' && chs[i] <= '9') || chs[i] == '/')) // isDigit(s[i]) // ? { rev = rev + chs[i]; ++i; } rev = MakeReverse(rev); Out = Out + rev; } else { Out = Out + chs[i]; ++i; } } s = Out; } catch (Exception ex) { // throw new Exception( // "An exception has occurred in ArabicReverse function.\\n" // + ex.getMessage()); } return s; } private static final boolean isFromTheSet1(/* WCHAR */char ch) { char[] theSet1 = new char[] { (char) 0x62c, (char) 0x62d, (char) 0x62e, (char) 0x647, (char) 0x639, (char) 0x63a, (char) 0x641, (char) 0x642, (char) 0x62b, (char) 0x635, (char) 0x636, (char) 0x637, (char) 0x643, (char) 0x645, (char) 0x646, (char) 0x62a, (char) 0x644, (char) 0x628, (char) 0x64a, (char) 0x633, (char) 0x634, (char) 0x638, (char) 0x67e, (char) 0x686, (char) 0x6a9, (char) 0x6af, (char) 0x6cc, (char) 0x626 }; int i = 0; while (i < 28) { if (ch == theSet1[i]) return true; ++i; } return false; } private static final boolean isFromTheSet2(/* WCHAR */char ch) { char[] theSet2 = new char[] { (char) 0x627, (char) 0x623, (char) 0x625, (char) 0x622, (char) 0x62f, (char) 0x630, (char) 0x631, (char) 0x632, (char) 0x648, (char) 0x624, (char) 0x629, (char) 0x649, (char) 0x698, (char) 0x6c0 }; int i = 0; while (i < 14) { if (ch == theSet2[i]) return true; ++i; } return false; } private static final String MakeReverse(String text) { String Result = ""; char[] Ctext = new char[text.length()]; Ctext = text.toCharArray(); for (int i = (text.length()) - 1; i >= 0; i--) { Result += Ctext[i]; } return Result; } public static final String ConvertBackToRealFarsi(String In) { if (!isFarsiConversionNeeded) { return In; } String strOut = ""; StringBuilder strBuilder = new StringBuilder(""); int i = 0; int j = 0; char[] chIn = new char[In.length()]; chIn = In.toCharArray(); for (i = 0; i < In.length(); i++) { boolean found = false; for (j = 0; j < arrStruc.length; j++) { if (chIn[i] == arrStruc[j].midGlyph || chIn[i] == arrStruc[j].iniGlyph || chIn[i] == arrStruc[j].endGlyph || chIn[i] == arrStruc[j].isoGlyph) { strBuilder.append(arrStruc[j].character); found = true; break; } } if (!found) strBuilder.append(chIn[i]); } strOut = strBuilder.toString(); strOut = strOut.replace(szLa, "لا"); strOut = strOut.replace(szLaStick, "لا"); return strOut; } public static final String Convert(String In) { if (!isFarsiConversionNeeded) { return In; } if (In == null) { return ""; } boolean linkBefore, linkAfter; String Out = In; char[] chOut = new char[Out.length()]; chOut = Out.toCharArray(); char[] chIn = new char[In.length()]; chIn = In.toCharArray(); for (int i = 0; i < In.length(); i++) { /* WCHAR */ char ch = chIn[i]; if ((ch >= (char) 0x0621 && ch <= (char) 0x064a) || (ch == (char) 0x067e) || (ch == (char) 0x0686) || (ch == (char) 0x0698) || (ch == (char) 0x06a9) || (ch == (char) 0x06af) || (ch == (char) 0x06cc) || (ch == (char) 0x06c0)) // is a Farsi character? { int idx = 0; while (idx < N_DISTINCT_CHARACTERS) { if (arrStruc[idx].character == chIn[i]) break; ++idx; } if (i == In.length() - 1) linkAfter = false; else linkAfter = (isFromTheSet1(chIn[i + 1]) || isFromTheSet2(chIn[i + 1])); if (i == 0) linkBefore = false; else linkBefore = isFromTheSet1(chIn[i - 1]); if (idx < N_DISTINCT_CHARACTERS) { if (linkBefore && linkAfter) chOut[i] = arrStruc[idx].midGlyph; if (linkBefore && !linkAfter) chOut[i] = arrStruc[idx].endGlyph; if (!linkBefore && linkAfter) chOut[i] = arrStruc[idx].iniGlyph; if (!linkBefore && !linkAfter) chOut[i] = arrStruc[idx].isoGlyph; } else { chOut[i] = chIn[i]; } } else { chOut[i] = chIn[i]; } } Out = ""; for (int j = 0; j < chOut.length; j++) Out += chOut[j]; // Out = ArabicReverse(Out); Out = Out.replace((char) 0x200c, ' '); // Change NO SPACE to SPACE Out = Out.replace(szLamAndAlef, szLa); // Join 'Lam' and 'Alef' and // make 'La' Out = Out.replace(szLamStickAndAlef, szLaStick); // Join 'Lam Stick' // and 'Alef' // and make 'La // Stick' return reorderWords(Out); } private final static String reorderWords(String strIn) { final int ST_RTL = 0; final int ST_LTR = 1; String strOut = ""; String prevWord = ""; int state = ST_RTL; char[] arr = strIn.toCharArray(); int i = 0; while (i < arr.length) { if (charIsLTR(arr[i]) && state != ST_LTR) { // state changed to LTR state = ST_LTR; strOut = prevWord + strOut; prevWord = ""; prevWord += arr[i]; } else if (charIsRTL(arr[i]) && state != ST_RTL) { // state changed to RTL state = ST_RTL; strOut = prevWord + strOut; prevWord = ""; prevWord += arr[i]; } else { // state is not changed prevWord += arr[i]; } i++; } strOut = prevWord + strOut; return strOut; } private final static boolean charIsLTR(char ch) { return (ch >= (char) 65 & ch <= (char) 122) | Character.isDigit(ch); } private final static boolean charIsRTL(char ch) { return ch >= (char) 0x0621; } private static Typeface typeface; public static final Typeface GetFarsiFont(Context context) { if (typeface == null) { typeface = Typeface.createFromAsset(context.getAssets(), // "DroidSansFallback.ttf"); "tahoma.ttf"); } return typeface; } }
And just use
Farsi.Convert("SOME FARSI STRING");
You can download tahoma.ttf from here
EDIT
When you override onOptionsItemSelected
switch(item.getItemId())
{
case R.id.abcd:
if(item.getTitle().equals("ABCD'")){
item.setTitle(Farsi.Convert("SOME FARSI STRING");
}
break;
}
回答2:
You will have to create a custom toast first.
Follow this link: CustomToast, then reference your text view and set the typeface to the textview.
Try it and let me know if it works.
来源:https://stackoverflow.com/questions/21874121/how-can-i-write-farsi-persian-in-android