1

Я пытаюсь добавить TextView в моем LinearLayout. Но это немного сложно, потому что мне нужно создать все приложение программно и добавить элемент программно. Я разобрать файл JSON, и я получаю Вид с него, как это:Добавить TextView программно с помощью JSON

JSONParser.java:

public class JSONParser extends Activity { 

private JSONObject myjsonobj = null; 
    // Map<String, String> jsonresult = new HashMap<String, String>(); 

// private JSONArray myinterface = null; 

    public JSONParser(String file) throws IOException { 
     file = "assets/JsonTest.txt"; 

     InputStream is = this.getClass().getClassLoader().getResourceAsStream(file); 
     StringBuffer sb = new StringBuffer(); 
     try { 
      BufferedReader buf = new BufferedReader(new InputStreamReader(is, 
        "UTF-8")); 
      String temp; 
      while ((temp = buf.readLine()) != null) 
       sb.append(temp); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { } 

     try { 
      Log.e("Parser JSON", "Parser JSON OK"); 
      myjsonobj = new JSONObject(sb.toString()); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     Log.e("OBJSON", myjsonobj.toString()); 
    } 

    public ClassicView getClassicViewWithId(int id, Context context) throws JSONException { 
     JSONArray myView = myjsonobj.getJSONObject("interface").getJSONArray("View");     
     for (int i = 0; i < myView.length(); i++) { 
      if (myView.getJSONObject(i).getInt("id") == id) { 
       Log.e("IDVIEW", myView.getJSONObject(i).getString("id")); 
       ClassicView myClassicView = new ClassicView(myView.getJSONObject(i).getInt("id")); 

       classicSetLabel(myView.getJSONObject(i).getJSONArray("Label"), myClassicView, context); 
       return myClassicView; 
      } 
     } 
     return null; 
    } 

ClassicView.java:

public class ClassicView extends Activity { 

public int myid; 


public ClassicView() { 

} 
    public ClassicView(int id){ 
     super(); 
     myid = id; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.linearlayout); 

     LinearLayout ll = (LinearLayout) findViewById(R.id.linearlayout2); 

     LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(new ViewGroup.MarginLayoutParams(
       LinearLayout.LayoutParams.WRAP_CONTENT, 
       LinearLayout.LayoutParams.WRAP_CONTENT));   
     setContentView(ll); 
    } 
} 

У меня есть функция SetClassicLabel в мой JSONParser класс. Я хочу добавить неопределенное число TextView. Я прочитал номер в моем json-файле. Я хочу добавить TextView в мой ClassicView, но я не знаю, как это сделать. Я попытался это, но он не работает:

public RelativeLayout.LayoutParams setPosition(int positionX,int positionY){ 


     RelativeLayout.LayoutParams params = 
        new RelativeLayout.LayoutParams(
         RelativeLayout.LayoutParams.WRAP_CONTENT, 
         RelativeLayout.LayoutParams.WRAP_CONTENT); 

     params.addRule(positionX); 
     params.addRule(positionY); 
     return params; 
    } 

    public void classicSetLabel(JSONArray myArrayLabel, ClassicView classicView, Context context) throws JSONException { 

     Log.e("@@@@@WARNING TEXTLABEL :", "classicSetLabelErreur1"); 
     Log.e("@@@@@WARNING TEXTLABEL :", "classicSetLabelErreur2"); 
     for (int i = 0; i < myArrayLabel.length(); i++) { 
      Log.e("CLASSICVIEW", classicView.toString()); 
      TextView myTextView = new TextView(context); 
      LinearLayout myLayout = new LinearLayout(context); 
      myTextView.append(myArrayLabel.getJSONObject(i).getString("text")); 
      myLayout.addView(myTextView, setPosition(RelativeLayout.CENTER_HORIZONTAL,RelativeLayout.CENTER_VERTICAL)); 
      Log.e("@@@@@WARNING TEXTLABEL :", myArrayLabel.getJSONObject(i).getString("text")); 
      Log.e("@@@@@WARNING TEXTPOS_X", myArrayLabel.getJSONObject(i).getString("position_x")); 
      Log.e("@@@@@WARNING TEXTPOS_Y", myArrayLabel.getJSONObject(i).getString("position_y")); 
      setContentView(myLayout); 
     } 

}

MainActivity.java:

public class MainActivity extends Activity { 

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


    JSONParser jParser = null; 
    try { 
     jParser = new JSONParser("JsonTest.txt"); 
    } catch (IOException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    try { 
     ClassicView view = jParser.getClassicViewWithId(0, MainActivity.this); 
     //Log.e("idVIEWMAIN :", msg) 
     Intent intent = new Intent(MainActivity.this, view.getClass()); 
     startActivity(intent); 
    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

Вот мой Logcat:

11-27 06:34:50.878: E/IDVIEW(30402): 0 
    11-27 06:34:50.878: E/@@@@@WARNING TEXTLABEL :(30402): classicSetLabelErreur1 
11-27 06:34:50.888: E/@@@@@WARNING TEXTLABEL :(30402): classicSetLabelErreur2 
11-27 06:34:50.888: E/CLASSICVIEW(30402): [email protected] 
11-27 06:34:50.898: E/@@@@@WARNING TEXTLABEL :(30402): bonjour comment ca va ? 
11-27 06:34:50.898: E/@@@@@WARNING TEXTPOS_X(30402): 200 
11-27 06:34:50.898: E/@@@@@WARNING TEXTPOS_Y(30402): 400 
11-27 06:34:50.898: D/AndroidRuntime(30402): Shutting down VM 
11-27 06:34:50.898: W/dalvikvm(30402): threadid=1: thread exiting with uncaught exception (group=0x411d32a0) 
11-27 06:34:50.898: E/AndroidRuntime(30402): FATAL EXCEPTION: main 
11-27 06:34:50.898: E/AndroidRuntime(30402): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.fchps.bya/com.fchps.bya.MainActivity}: java.lang.NullPointerException 
11-27 06:34:50.898: E/AndroidRuntime(30402): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2081) 
11-27 06:34:50.898: E/AndroidRuntime(30402): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2106) 
11-27 06:34:50.898: E/AndroidRuntime(30402): at android.app.ActivityThread.access$700(ActivityThread.java:134) 
11-27 06:34:50.898: E/AndroidRuntime(30402): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1217) 
11-27 06:34:50.898: E/AndroidRuntime(30402): at android.os.Handler.dispatchMessage(Handler.java:99) 
11-27 06:34:50.898: E/AndroidRuntime(30402): at android.os.Looper.loop(Looper.java:137) 
11-27 06:34:50.898: E/AndroidRuntime(30402): at android.app.ActivityThread.main(ActivityThread.java:4856) 
11-27 06:34:50.898: E/AndroidRuntime(30402): at java.lang.reflect.Method.invokeNative(Native Method) 
11-27 06:34:50.898: E/AndroidRuntime(30402): at java.lang.reflect.Method.invoke(Method.java:511) 
11-27 06:34:50.898: E/AndroidRuntime(30402): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007) 
11-27 06:34:50.898: E/AndroidRuntime(30402): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774) 
11-27 06:34:50.898: E/AndroidRuntime(30402): at dalvik.system.NativeStart.main(Native Method) 
11-27 06:34:50.898: E/AndroidRuntime(30402): Caused by: java.lang.NullPointerException 
11-27 06:34:50.898: E/AndroidRuntime(30402): at android.app.Activity.setContentView(Activity.java:1921) 
11-27 06:34:50.898: E/AndroidRuntime(30402): at com.fchps.bya.json.JSONParser.classicSetLabel(JSONParser.java:107) 
11-27 06:34:50.898: E/AndroidRuntime(30402): at com.fchps.bya.json.JSONParser.getClassicViewWithId(JSONParser.java:71) 
11-27 06:34:50.898: E/AndroidRuntime(30402): at com.fchps.bya.MainActivity.onCreate(MainActivity.java:32) 
11-27 06:34:50.898: E/AndroidRuntime(30402): at android.app.Activity.performCreate(Activity.java:5047) 
11-27 06:34:50.898: E/AndroidRuntime(30402): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094) 
11-27 06:34:50.898: E/AndroidRuntime(30402): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2045) 
11-27 06:34:50.898: E/AndroidRuntime(30402): ... 11 more 

Кто-то понять, что я хочу сделать o и может объяснить мне, что я ошибаюсь, пожалуйста?

Спасибо :)

+0

Существует проблема в вашем 'методе MainActivity' OnCreate. Пожалуйста, разместите код вашего основного аккаунта. – GrIsHu

+0

@GrIsHu я отправляю это – Fcps

ответ

0

Можете ли вы попробовать, как это:

LinearLayout layout = ... // Your linear layout. 
ListAdapter adapter = ... // Your adapter. Add the JSON text in the list-adapter 
          //(populate the adapter using you json parser) 
for (int i = 0; i < adapter.getCount(); i++) { 
    View item = adapter.getView(i, null, null); 
    layout.addView(item); 
} 
+0

я не понимаю:/ – Fcps

+0

Вы ищете обновления ListView с динамической TextView? – Yup

+0

Нет. Я хочу установить TextView в свой макет. Если у меня есть 5 TextView в моем json. Мне нужно создать 5 TextView в макете. Не ListView, но это сложно. – Fcps