我正在编写一个Android应用程序,使用XML文件动态生成用户界面。 XML文件包含每个UI元素的标记。这是文件的一小部分(整个文件太大,因为有很多屏幕需要生成
<?xml version="1.0" encoding="UTF-8" ?><form>
<title>DataCollectApp</title>
<tableName>FormDB</tableName>
<!-- ************page 1***************-->
<fields>
<uiComponentType>label</uiComponentType>
<displayText>Data Collection</displayText>
<groupNumber>1</groupNumber>
<dbName>label1</dbName>
<required>true</required>
<font>Helvetica-Bold</font>
<fontSize>16</fontSize>
</fields>
<fields>
<uiComponentType>button</uiComponentType>
<buttonDisplayText>Collect Data</buttonDisplayText>
<groupNumber>1</groupNumber>
<navigateToGroup>2</navigateToGroup>
<selectorFunction>navigate</selectorFunction>
<dbName>button1</dbName>
<required>true</required>
<font>Helvetica-Bold</font>
<fontSize>14</fontSize>
</fields>
<fields>
<uiComponentType>button</uiComponentType>
<buttonDisplayText>Sync</buttonDisplayText>
<groupNumber>1</groupNumber>
<navigateToGroup>3</navigateToGroup>
<selectorFunction>navigate</selectorFunction>
<dbName>button2</dbName>
<required>true</required>
<font>Helvetica-Bold</font>
<fontSize>14</fontSize>
</fields>
<fields>
<uiComponentType>button</uiComponentType>
<buttonDisplayText>History</buttonDisplayText>
<groupNumber>1</groupNumber>
<navigateToGroup>4</navigateToGroup>
<selectorFunction>navigate</selectorFunction>
<dbName>button3</dbName>
<required>true</required>
<font>Helvetica-Bold</font>
<fontSize>14</fontSize>
</fields>
<fields>
<uiComponentType>button</uiComponentType>
<buttonDisplayText>Support Form</buttonDisplayText>
<groupNumber>1</groupNumber>
<navigateToGroup>33</navigateToGroup>
<!--<selectorFunction></selectorFunction>-->
<dbName>button4</dbName>
<required>true</required>
<font>Helvetica-Bold</font>
<fontSize>14</fontSize>
</fields>
<!-- ************page 2***************-->
<fields>
<uiComponentType>labelTextBox</uiComponentType>
<displayText>Recorder</displayText>
<groupNumber>2</groupNumber>
<dbName>labelTextBox1</dbName>
<required>true</required>
<inputType>IT_TEXT</inputType>
<font>Helvetica-Bold</font>
<fontSize>14</fontSize>
</fields>
<fields>
<uiComponentType>labelTextBox</uiComponentType>
<displayText>Handler</displayText>
<hint>enter handler</hint>
<groupNumber>2</groupNumber>
<dbName>labelTextBox2</dbName>
<required>true</required>
<inputType>IT_TEXT</inputType>
<font>Helvetica-Bold</font>
<fontSize>14</fontSize>
</fields>
</xml>
<groupNumber>
标记表示视图编号,而<navigateToGroup>
标记显示单击按钮时生成的视图。在上面的示例中,当我在第一个视图中单击“收集数据”按钮时,它将转到第2页下的元素。我能够获得正确的导航,但新视图显示在第一个屏幕下方而不是上一个屏幕的位置。这是我主要活动的代码。
package com.androidxmlparser;
import java.io.FileInputStream;
import java.io.StringReader;
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.jiteshandroidsaxparser.R;
import android.annotation.SuppressLint;
import android.app.ActionBar.LayoutParams;
import android.app.Activity;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import android.app.Activity;
import android.view.Menu;
@SuppressLint("InlinedApi")
public class MainActivity extends Activity {
private TextView xmlOutput;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String parsedData = "";
try {
int cnt =0;
Log.w("AndroidParseXMLActivity", "Start");
/** Handling XML */
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
ItemXMLHandler myXMLHandler = new ItemXMLHandler();
xr.setContentHandler(myXMLHandler);
xr.parse(new InputSource(getAssets().open("data.xml")));
final ArrayList<ItemMaster> itemsList = myXMLHandler.getItemsList();
//xmlOutput.setText(parsedData);
//main.addView(xmlOutput);
final LinearLayout main=(LinearLayout) findViewById(R.id.main);
cnt = 1;
//final ItemMaster item = itemsList.get(cnt);
//final LinearLayout main=(LinearLayout) findViewById(R.id.main);
LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(200, LinearLayout.LayoutParams.WRAP_CONTENT );
xmlOutput = (TextView) findViewById(R.id.xmlOutput);
for(int i = 1; i <= itemsList.size(); i++)
{
cnt = i;
ItemMaster item = itemsList.get(cnt);
int pageNumber = item.getgroupNumber();
if(pageNumber == 1)
{
String compType = item.getuiComponentType();
//parsedData = parsedData + compType;
//xmlOutput.setText(parsedData);
if(compType.equals("button"))
{
createButtons(main,p,item,itemsList);
}
else if(compType.equalsIgnoreCase("label"))
{
createLabels(main,p,item,itemsList);
}
else if(compType.equals("labelTextBox"))
{
createTextFields(main,p,item,itemsList);
}
//generateInterface(main,p,item,1,itemsList);
}
}
main.addView(xmlOutput);
Log.w("AndroidParseXMLActivity", "Done");
}catch (Exception e) {
Log.w("AndroidParseXMLActivity", e);
}
}
public void createButtons(LinearLayout main, LinearLayout.LayoutParams p, ItemMaster item, ArrayList<ItemMaster> itemsList)
{
Button buttonView = new Button(this);
String buttonText = item.getbuttonDisplayText();
buttonView.setText(buttonText);
//buttonView.setText(buttonText);type name = new type(arguments);
final int targetPage = item.getnavigateToGroup();
final LinearLayout submain = main;
final LinearLayout.LayoutParams subp = new LinearLayout.LayoutParams(200, LinearLayout.LayoutParams.WRAP_CONTENT );;
final ItemMaster subItem = item;
final ArrayList<ItemMaster> subitemsList = itemsList;
buttonView.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Perform action on click
for (ItemMaster it : subitemsList)
{
if(subItem.navigateToGroup == it.groupNumber)
{
generateInterface(submain,subp,it,targetPage,subitemsList);
TextView view =new TextView(MainActivity.this);
view.setLayoutParams(subp);
submain.addView(view,subp);
//submain.addView(v);
}
}
}
});
main.addView(buttonView, p);
}
public void generateInterface(LinearLayout main, LinearLayout.LayoutParams p, ItemMaster item, int pgNum, ArrayList<ItemMaster> itemsList)
{
String compType = item.getuiComponentType();
//parsedData = parsedData + compType;
//xmlOutput.setText(parsedData);
if(compType.equals("button"))
{
createButtons(main,p,item,itemsList);
}
else if(compType.equalsIgnoreCase("label"))
{
createLabels(main,p,item,itemsList);
}
else if(compType.equals("labelTextBox"))
{
createTextFields(main,p,item,itemsList);
}
}
public void createLabels(LinearLayout main, LinearLayout.LayoutParams p, ItemMaster item, ArrayList<ItemMaster> itemsList)
{
TextView labelView = new TextView(this);
String labelText = item.getdisplayText();
labelView.setText(labelText);
//buttonView.setText(buttonText);
main.addView(labelView, p);
}
public void createTextFields(LinearLayout main, LinearLayout.LayoutParams p, ItemMaster item, ArrayList<ItemMaster> itemsList)
{
TextView inputLabel = new TextView(this);
String inputLabelText = item.getdisplayText();
inputLabel.setText(inputLabelText);
main.addView(inputLabel, p);
EditText textBox = new EditText(this);
textBox.setWidth(5);
main.addView(textBox, p);
}
}
如果我在提出问题时犯了任何错误,我会提前道歉。我知道单击按钮时会创建一个新视图,然后该视图将使用新的布局参数添加到主布局中。
答案 0 :(得分:0)
如果你的“主要”LinearLayout只意味着拥有一个孩子,你可以这样做:
main.removeAllViews();
main.addView(xmlOutput);