繁体   English   中英

单击按钮时生成新视图Android

[英]Generating a new View when a button is clicked Android

我正在编写一个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页下的元素。我能够获得正确的导航,但是新的View出现在第一个屏幕下方,而不是在前一个屏幕的位置。 这是我主要活动的代码。

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

如有任何错误,我谨向您致歉。 我知道单击按钮时将创建一个新视图,并且该视图稍后将使用新的布局参数添加到主布局中。

如果您的“主要” LinearLayout仅意味着要容纳一个孩子,则可以执行以下操作:

main.removeAllViews();
main.addView(xmlOutput);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM