2014-12-06 14 views
0

我正在編寫一個Android應用程序,使用XML文件動態生成用戶界面。 XML文件包含每個UI元素的標籤。下面是該文件的一小部分(整個文件太大,因爲有將要產生單擊按鈕時生成新視圖Android

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

I如果我在提問時犯了錯誤,請提前道歉。我知道點擊按鈕時會創建一個新視圖,並且該視圖稍後將添加到具有新佈局參數的主佈局中。

+0

我想尋找碎片,如果你正在尋找替代你的UI的某些部分。 – tachyonflux 2014-12-06 19:01:40

+0

我看了一下Fragment文檔。雖然我認爲這很有用,但我認爲這不會影響我的案子。稍後,我將在本地sqlite數據庫中存儲每個View的數據(除了只有按鈕的Views)。爲此,我想我必須在單擊按鈕時生成一個新的View(我知道它將是一個Child View)。 – user2246566 2014-12-06 19:15:49

+0

我加了一個答案。我仍然認爲在這裏使用片段是正確的,也許你應該更多地考慮它。 – tachyonflux 2014-12-06 19:25:25

回答

0

如果你的「主」的LinearLayout只是意味着持有一個孩子,你可以這樣做:

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

謝謝你的迴應!我按照您的建議進行了編輯,但是,它仍然在第一個視圖的下方生成第二個視圖。我會進一步研究碎片以及! – user2246566 2014-12-06 19:33:45