6

I want the output as shown in below image

This is in Gurumukhi Font

This is a Sikh holy book which uses the Regional font(Gurumukhi) and i want to make an xml file of this text to use the xml parsing to show in my application. But the Problem is when i paste this font in my xml file it converts into the some alphabets and symbols like below

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

I have placed a Gurumukhi font file in the asset folder and use the below code which works fine

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")

In that way the text in that text view converts into the Gurumukhi but How can i create my Xml file for this type of text in it. Or Give me some Good Suggestion that which way is better to work on this type of app and handle the text. I have to show 4-5 Holy books in one app and each have 20-25 pages. Any help is appreciated.

Naresh Sharma
  • 4,323
  • 7
  • 48
  • 68

3 Answers3

4

Update Since you want to use via XML Your layout.xml should be like

<?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>

and 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>

Hello Extend your textview

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);

    }


}

Now Your 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>

Activity

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");
    }
}

Final Output

Raghav
  • 4,590
  • 1
  • 22
  • 32
  • You didn't see my question's last lines in that i explained that i am able to that like you have done. But there are more than 20-25 pages in each book so i can't set the text like that on different textview. So i want to make a xml file from where i can fetch the text or please give me some other better way by which i can do that. Otherwise ur work is appreciable. Thanks for ur help and answer. please show me the way to do that – Naresh Sharma Jun 28 '12 at 06:49
  • i have voted ur answer and thanks for the effort. Just give me one suggestion that how can i show the other pages text. either i have to use more text view like that and set the text on that or what i should do to set the different text on the same text view. – Naresh Sharma Jun 28 '12 at 07:09
  • You can use `` for adding scroll, if you have more pages you can addthem dynamically using `setText` method or add seperate activity. Best approach is to add a seprate record for each page in `string.xml`. – Raghav Jun 28 '12 at 07:13
  • Then how can i show that different text from the string.xml on the same textview again and again. – Naresh Sharma Jun 28 '12 at 07:16
  • Add a button with `onclicklistener` then use `setText` of your extended `textview` and use `setText(getResources().getString(R.string.page1)) ` then page2 etc etc – Raghav Jun 28 '12 at 07:19
  • Ok i will try ur suggestion. Thanks :) – Naresh Sharma Jun 28 '12 at 07:20
4

I have made some changes in xml keep in mind that changes are required.

I have made an data.xml in asset folder the xml is as look like as shown below

    <?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>

after that see my StudyParser.class as shown below

  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));
      }


}

after code in my activity is as shown below

 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());
   }
Khan
  • 7,585
  • 3
  • 27
  • 44
1

It seems that you are trying to use a privately-encoded 8-bit font for Gurmukhi letters, i.e. a font with code number range 0..255 with each number mapped to a character according to some font-dependent convention, not by any standard encoding.

Consider using Unicode (UTF-8) and a Unicode-encoded font instead.

Jukka K. Korpela
  • 195,524
  • 37
  • 270
  • 390