Android 如何从从资产文件读取的xml数据动态创建可单击的文本视图?

Android 如何从从资产文件读取的xml数据动态创建可单击的文本视图?,android,xml,eclipse,textview,clickable,Android,Xml,Eclipse,Textview,Clickable,我现在已经做完作业了 我有一个应用程序,它读取一个资产xml文件,其中包含第一个字段以大写字母开头的条目 我阅读了xml,并希望动态创建可单击的文本视图,以便能够显示按第一个字母分组的其余数据 我在这里包括我的应用程序中的所有相关文件 应用程序现在所做的就是显示一个Log.v,我确实读取了我需要的所有数据 我故意将layout.xml保留为空。我确实希望动态创建TextView 任何人都可以为我写剩下的代码 我希望您能为我做的,或者向我展示的是——我想当我阅读XML文件时——如何为我在字段中找到

我现在已经做完作业了

我有一个应用程序,它读取一个资产xml文件,其中包含第一个字段以大写字母开头的条目

我阅读了xml,并希望动态创建可单击的文本视图,以便能够显示按第一个字母分组的其余数据

我在这里包括我的应用程序中的所有相关文件

应用程序现在所做的就是显示一个Log.v,我确实读取了我需要的所有数据

我故意将layout.xml保留为空。我确实希望动态创建TextView

任何人都可以为我写剩下的代码

我希望您能为我做的,或者向我展示的是——我想当我阅读XML文件时——如何为我在字段中找到的每个新字母动态创建一个可单击的文本视图,并将其显示在布局上

清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.barebonesxmlread"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.barebonesxmlread.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">bareBonesXMLRead</string>
    <string name="action_settings">Settings</string>
    <string name="hello_world">Barebones XML Read!</string>

</resources>

裸体
设置
赤裸裸的XML阅读!

我忘了什么吗!问

您需要根据包含解析数据的arraylist的大小创建循环。 创建动态文本视图的代码如下:

for (int i = 0; i < Tel.size(); i++) {

                final TextView phone = new TextView(context);
                phone.setTextAppearance(context,
                        android.R.style.TextAppearance_Medium);
                phone.setText(Tel.get(i));
                phone.setTypeface(Typeface.DEFAULT);
                phone.setTextColor(Color.BLUE);
                phone.setPaintFlags(phone.getPaintFlags()
                        | Paint.UNDERLINE_TEXT_FLAG);

                phone.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {

                        Call(phone.getText().toString());

                    }
                });

                InfoContainer.addView(phone);

            }
for(int i=0;i

这是我的阵列列表,包含所有电话号码。InfoContainer是我的父linearlayout,我在其中添加这些动态创建的文本视图。

你不知道我得到答案有多感激,你也无法想象我对这一点有多陌生。如果你想麻烦的话,我需要你做以下事情:告诉我应该把代码贴在哪里;将您在该代码段中使用的变量名称更改为我在代码中使用的变量名称,因为我对此非常怀疑。那对我有很大帮助!谢谢
package com.example.barebonesxmlread;

import java.io.InputStream;
import java.util.ArrayList;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

import com.example.barebonesxmlread.GermanyPlatesInfo;
import com.example.barebonesxmlread.OrderXMLHandler;
import com.example.barebonesxmlread.R;

import android.os.Bundle;
import android.app.Activity;
import android.content.res.AssetManager;
import android.util.Log;
import android.view.Menu;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        parseXML();
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    private void parseXML()
    {
        AssetManager assetManager = getBaseContext().getAssets();
        try {
              InputStream is = assetManager.open("order.xml");
              SAXParserFactory spf = SAXParserFactory.newInstance();
               SAXParser sp = spf.newSAXParser();
               XMLReader xr = sp.getXMLReader();

               OrderXMLHandler myXMLHandler = new OrderXMLHandler();
               xr.setContentHandler(myXMLHandler);
               InputSource inStream = new InputSource(is);
               xr.parse(inStream);

               ArrayList<GermanyPlatesInfo> plateList = myXMLHandler.getCartList();
               int i = 0;
               for(GermanyPlatesInfo germanyPlatesInfo: plateList)
               {
                   Log.v("Data", ++i + ": " + germanyPlatesInfo.seqNo + ": "  + germanyPlatesInfo.getItemNumber() + " - " + germanyPlatesInfo.getLandName());
               } // end of do all plates
                is.close();     
            } // end of try
            catch (Exception e)
            {
                Log.v("JPB catch in parseXML", e.getMessage(), e);
            } // end of catch
    } // end of parseXML function
}
package com.example.barebonesxmlread;

import java.util.ArrayList;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class OrderXMLHandler extends DefaultHandler {

 boolean currentElement = false;
 String currentValue = "";

 GermanyPlatesInfo germanyPlatesInfo;
 ArrayList<GermanyPlatesInfo> plateList;

 public ArrayList<GermanyPlatesInfo> getCartList() {
  return plateList;
 }

 public void startElement(String uri, String localName, String qName,
   Attributes attributes) throws SAXException {

  currentElement = true;

  if (qName.equals("germany_licence_plates")){
   plateList = new ArrayList<GermanyPlatesInfo>();
  } 
  else if (qName.equals("licence_plate")) {
   germanyPlatesInfo = new GermanyPlatesInfo();
  }

 }

 public void endElement(String uri, String localName, String qName)
 throws SAXException {

  currentElement = false;

  if (qName.equalsIgnoreCase("abbrev"))
   germanyPlatesInfo.setSeqNo(currentValue.trim());
  else if (qName.equalsIgnoreCase("full_name"))
   germanyPlatesInfo.setItemNumber(currentValue.trim());
  else if (qName.equalsIgnoreCase("land_name"))
   germanyPlatesInfo.setLandName(currentValue.trim());
  else if (qName.equalsIgnoreCase("Price"))
   germanyPlatesInfo.setPrice(currentValue.trim());
  else if (qName.equalsIgnoreCase("licence_plate"))
   plateList.add(germanyPlatesInfo);

  currentValue = "";
 }

 public void characters(char[] ch, int start, int length)
 throws SAXException {

  if (currentElement) {
   currentValue = currentValue + new String(ch, start, length);
  }

 }

}
package com.example.barebonesxmlread;

public class GermanyPlatesInfo {

 String seqNo = null;
 String itemNumber = "";
 String land_name = "";
 String price = "";

 public String getSeqNo() {
  return seqNo;
 }
 public void setSeqNo(String seqNo) {
  this.seqNo = seqNo;
 }
 public String getItemNumber() {
  return itemNumber;
 }
 public void setItemNumber(String itemNumber) {
  this.itemNumber = itemNumber;
 }
 public String getLandName() {
  return land_name;
 }
 public void setLandName(String land_name) {
  this.land_name = land_name;
 }
 public String getPrice() {
  return price;
 }
 public void setPrice(String price) {
  this.price = price;
 }


}
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">bareBonesXMLRead</string>
    <string name="action_settings">Settings</string>
    <string name="hello_world">Barebones XML Read!</string>

</resources>
for (int i = 0; i < Tel.size(); i++) {

                final TextView phone = new TextView(context);
                phone.setTextAppearance(context,
                        android.R.style.TextAppearance_Medium);
                phone.setText(Tel.get(i));
                phone.setTypeface(Typeface.DEFAULT);
                phone.setTextColor(Color.BLUE);
                phone.setPaintFlags(phone.getPaintFlags()
                        | Paint.UNDERLINE_TEXT_FLAG);

                phone.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {

                        Call(phone.getText().toString());

                    }
                });

                InfoContainer.addView(phone);

            }