【问题标题】:I want to show the Reginonal language(Gurumukhi) in my Android app我想在我的 Android 应用中显示区域语言(Gurmukhi)
【发布时间】:2012-06-29 15:14:04
【问题描述】:

我想要如下图所示的输出

这是一本使用区域字体 (Gurumukhi) 的锡克教圣书,我想制作此文本的 xml 文件,以使用 xml 解析在我的应用程序中显示。但问题是当我将此字体粘贴到我的 xml 文件中时,它会转换为如下所示的一些字母和符号

jpujI swihb
<> siq nwmu krqw purKu inrBau inrvYru
Akwl mUriq AjUnI sYBM gur pRswid ]
] jpu ]
Awid scu jugwid scu ]
hY BI scu nwnk hosI BI scu ]1]
socY soic n hoveI jy socI lK vwr ]
cupY cup n hoveI jy lwie rhw ilv qwr ]
BuiKAw BuK n auqrI jy bMnw purIAw Bwr ]
shs isAwxpw lK hoih q iek n clY nwil ]
ikv sicAwrw hoeIAY ikv kUVY qutY pwil ]
hukim rjweI clxw nwnk iliKAw nwil ]1]
hukmI hovin Awkwr hukmu n kihAw jweI ]
hukmI hovin

我已经在资产文件夹中放置了一个 Gurumukhi 字体文件,并使用下面的代码可以正常工作

Typeface tf = Typeface.createFromAsset(getAssets(),
                "fonts/bulara_5.ttf");
        textView = (TextView) findViewById(R.id.textView1);
        textView.setTypeface(tf);
        textView.setMovementMethod(new ScrollingMovementMethod());
        textView.setText(" <>siq nwmu krqw purKu inrBau inrvYru")

这样,该文本视图中的文本将转换为 Gurumukhi,但 How can i create my Xml file for this type of text in it。或Give me some Good Suggestion that which way is better to work on this type of app and handle the text。我必须在一个应用程序中展示 4-5 本书,每本书有 20-25 页。任何帮助表示赞赏。

【问题讨论】:

  • Namastey,如果你想这样做,你需要扩展你的文本视图:)
  • @iNan Namastey 以及如何扩展该文本视图以及如何将这种类型的文本放入 xml 文件中。有没有其他方法可以做到这一点?
  • 是的,我会帮助你的,请给我一个下载字体的链接??
  • sikhnet.com/Gurmukhi-Fonts 你可以从这里下载 Bulara 字体 zip 文件
  • @NareshSharma,在该页面上,“下载 bulara.zip”链接指向仅包含 index.html 的 zip 文件。

标签: android xml localization fonts


【解决方案1】:

我在 xml 中做了一些更改,请记住需要更改。

我在资产文件夹中创建了一个 data.xml,xml 如下所示

    <?xml version="1.0" encoding="UTF-8"?>
    <book1>
    <page1>&#60;&#62; siq nwmu krqw purKu inrBau inrvYru
    Akwl mUriq AjUnI sYBM gur pRswid ]
                    ] jpu ]
             Awid scu jugwid scu ]
      hY BI scu nwnk hosI BI scu ]1]
     socY soic n hoveI jy socI lK vwr ]
    cupY cup n hoveI jy lwie rhw ilv qwr ]
    BuiKAw BuK n auqrI jy bMnw purIAw Bwr ]
   shs isAwxpw lK hoih q iek n clY nwil ]
   ikv sicAwrw hoeIAY ikv kUVY qutY pwil ]
   hukim rjweI clxw nwnk iliKAw nwil ]1]
  hukmI hovin Awkwr hukmu n kihAw jweI ]
  hukmI hovin jIA hukim imlY vifAweI ]
  hukmI auqmu nIcu hukim iliK duK suK pweIAih ]
  ieknw hukmI bKsIs ieik hukmI sdw BvweIAih ]
  hukmY AMdir sBu ko bwhir hukm n koie ]
  nwnk hukmY jy buJY q haumY khY n koie ]2]
  gwvY ko qwxu hovY iksY qwxu ]</page1>
  </book1>

之后查看我的 StudyParser.class 如下所示

  import java.io.BufferedInputStream;
  import java.io.ByteArrayOutputStream;
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.InputStreamReader;
  import java.io.StringReader;
  import java.io.UnsupportedEncodingException;
  import java.net.MalformedURLException;

  import javax.xml.parsers.DocumentBuilder;
  import javax.xml.parsers.DocumentBuilderFactory;
  import javax.xml.parsers.ParserConfigurationException;

  import org.apache.http.HttpEntity;
  import org.apache.http.HttpResponse;
  import org.apache.http.client.methods.HttpPost;
  import org.apache.http.impl.client.DefaultHttpClient;
  import org.apache.http.util.EntityUtils;
  import org.w3c.dom.Document;
  import org.w3c.dom.Element;
  import org.w3c.dom.Node;
  import org.w3c.dom.NodeList;
  import org.xml.sax.InputSource;
  import org.xml.sax.SAXException;



  public class StudyParser {
public StudyParser() {

}

public final static Document XMLfromString(String xml){
     Document doc = null;

        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setCoalescing(true);
            try {

          DocumentBuilder db = dbf.newDocumentBuilder();

          InputSource is = new InputSource();
              is.setCharacterStream(new StringReader(xml));
              doc = db.parse(is); 

        } catch (ParserConfigurationException e) {
          System.out.println("XML parse error: " + e.getMessage());
          return null;
        } catch (SAXException e) {
          System.out.println("Wrong XML file structure: " + e.getMessage());
                return null;
        } catch (IOException e) {
          System.out.println("I/O exeption: " + e.getMessage());
          return null;
        }

            return doc;

  }
public static String getXMLstring(String xml){   
      String line = null;

      try {

        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(xml);

        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        line = EntityUtils.toString(httpEntity);

      } catch (UnsupportedEncodingException e) {
        line = "<results status=\"error\"><msg>Can't connect to server</msg></results>";
      } catch (MalformedURLException e) {
        line = "<results status=\"error\"><msg>Can't connect to server</msg></results>";
      } catch (IOException e) {
        line = "<results status=\"error\"><msg>Can't connect to server</msg></results>";
      }

      return line;

  }
public static String getXML(InputStream is)throws IOException {

    BufferedInputStream bis = new BufferedInputStream(is);
    ByteArrayOutputStream buf = new ByteArrayOutputStream();
    int result = bis.read();
    while(result != -1) {
      byte b = (byte)result;
      buf.write(b);
      result = bis.read();
    }        
    return buf.toString();
}
public final static String getElementValue( Node elem ) {
       Node kid;
       if( elem != null){
           if (elem.hasChildNodes()){
               for( kid = elem.getFirstChild(); kid != null; kid = kid.getNextSibling() ){
                   if( kid.getNodeType() == Node.TEXT_NODE  ){
                       return kid.getNodeValue();
                   }

               }
           }
       }
       return "";
   }
 public static int numResults(Document doc){    
        Node results = doc.getDocumentElement();
        int res = -1;

        try{
          res = Integer.valueOf(results.getAttributes().getNamedItem("Categories").getNodeValue());
        }catch(Exception e ){
          res = -1;
        }

        return res;
      }

      public static String getValue(Element item, String str) {    
        NodeList n = item.getElementsByTagName(str);    
        return StudyParser.getElementValue(n.item(0));
      }


}

我活动中的代码如下所示

 TextView txt;
 try{
 txt = (TextView)findViewById(R.id.tv); 
 String   xml= StudyParser.getXML(getAssets().open("data.xml"));    

   Document doc = StudyParser.XMLfromString(xml);
  NodeList n = doc.getElementsByTagName("book1");
 Element eid = (Element) n.item(0);
String Js=StudyParser.getValue(eid, "page1");
 Typeface tf = Typeface.createFromAsset(getAssets(),"bulara_5.ttf");
 txt.setTypeface(tf);
 txt.setText(Js);
   }catch(Exception e){
 Log.e("error",e.toString());
   }

【讨论】:

    【解决方案2】:

    更新 由于您想通过 XML 使用 你的 layout.xml 应该是这样的

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
         >
    
        <com.nannu.NanTV
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/book"
            android:textAppearance="?android:attr/textAppearanceLarge" 
    
            />
    
    </LinearLayout>
    

    和string.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    
    
        <string name="book"><![CDATA[jpujI swihb\\<> siq nwmu krqw purKu inrBau inrvYruAkwl mUriq AjUnI sYBM gur pRswid ]] jpu ]Awid scu jugwid scu ]hY BI scu nwnk hosI BI scu ]1]socY soic n hoveI jy socI lK vwr ]cupY cup n hoveI jy lwie rhw ilv qwr ]BuiKAw BuK n auqrI jy bMnw purIAw Bwr ]shs isAwxpw lK hoih q iek n clY nwil ]ikv sicAwrw hoeIAY ikv kUVY qutY pwil ]hukim rjweI clxw nwnk iliKAw nwil ]1]hukmI hovin Awkwr hukmu n kihAw jweI ]hukmI hovin]]></string>
    </resources>
    

    你好扩展你的文本视图

    package com.nannu;
    
    import android.content.Context;
    import android.graphics.Typeface;
    import android.util.AttributeSet;
    import android.widget.TextView;
    
    public class NanTV extends TextView{
    
        private Context c;
        public NanTV(Context c) {
            super(c);
            this.c = c;
            Typeface tfs = Typeface.createFromAsset(c.getAssets(),
                    "font/bulara_5.ttf");
            setTypeface(tfs);
    
        }
        public NanTV(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            this.c = context;
            Typeface tfs = Typeface.createFromAsset(c.getAssets(),
                    "font/bulara_5.ttf");
            setTypeface(tfs);
            // TODO Auto-generated constructor stub
        }
    
        public NanTV(Context context, AttributeSet attrs) {
            super(context, attrs);
            this.c = context;
            Typeface tfs = Typeface.createFromAsset(c.getAssets(),
                    "font/bulara_5.ttf");
            setTypeface(tfs);
    
        }
    
    
    }
    

    现在你的 layout.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
         >
    
        <com.nannu.NanTV
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Large Text"
            android:textAppearance="?android:attr/textAppearanceLarge" 
    
            />
    
    </LinearLayout>
    

    活动

    package com.nannu;
    
    import android.app.Activity;
    import android.os.Bundle;
    
    public class NanDempoActivity extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            NanTV nan = (NanTV)findViewById(R.id.textView1);
            nan.setText("jpujI swihb<> siq nwmu krqw purKu inrBau inrvYruAkwl mUriq AjUnI sYBM gur pRswid ]] jpu ]Awid scu jugwid scu ]hY BI scu nwnk hosI BI scu ]1]socY soic n hoveI jy socI lK vwr ]cupY cup n hoveI jy lwie rhw ilv qwr ]BuiKAw BuK n auqrI jy bMnw purIAw Bwr ]shs isAwxpw lK hoih q iek n clY nwil ]ikv sicAwrw hoeIAY ikv kUVY qutY pwil ]hukim rjweI clxw nwnk iliKAw nwil ]1]hukmI hovin Awkwr hukmu n kihAw jweI ]hukmI hovin");
        }
    }
    

    【讨论】:

    • 您没有看到我的问题的最后几行,因为我解释说我可以像您所做的那样。但是每本书有超过 20-25 页,所以我不能在不同的 textview 上设置这样的文本。所以我想制作一个 xml 文件,我可以从中获取文本,或者请给我一些其他更好的方法来做到这一点。否则你的工作是可观的。感谢您的帮助和回答。请告诉我这样做的方法
    • 我已经投票给你的答案,感谢你的努力。只要给我一个建议,我如何显示其他页面的文本。要么我必须使用更多这样的文本视图并在上面设置文本,要么我应该做些什么来在同一个文本视图上设置不同的文本。
    • 您可以使用&lt;ScrollView/&gt;添加滚动,如果您有更多页面,您可以使用setText方法动态添加它们或添加单独的活动。最好的方法是在string.xml 中为每个页面添加单独的记录。
    • 那么我怎样才能一次又一次地在同一个文本视图上显示来自 string.xml 的不同文本。
    • 添加带有onclicklistener 的按钮,然后使用扩展textviewsetText 并使用setText(getResources().getString(R.string.page1)) 然后使用page2 等
    【解决方案3】:

    您似乎正在尝试为 Gurmukhi 字母使用私有编码的 8 位字体,即代码编号范围为 0..255 的字体,每个数字根据某些字体相关约定映射到一个字符,而不是通过任何标准编码。

    考虑改用 Unicode (UTF-8) 和 Unicode 编码字体。

    【讨论】:

    • @NareshSharma,显然字体不是 Unicode 编码的,而是特定于字体的编码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    相关资源
    最近更新 更多