3

JSON ファイルの 2 行で動的に入力されたテキストビューを表示する Android アプリを作成しています。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="7dp"
    >
<TextView  
    android:id="@+id/item_name"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:padding="2dp"
    android:textSize="20dp" />
    <TextView  
    android:id="@+id/item_type"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:padding="2dp"
    android:textSize="13dp" />
</LinearLayout>

リスト項目のいずれかがクリックされたら、そのインデックスの残りの JSON 配列の内容を取得し、表示される配列として次のアクティビティに渡す必要があります。

最初のアクティビティ Java は次のとおりです。

public class TutListActivity extends ListActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    String sJSON = "";

    if(sJSON == ""){

        InputStream is = this.getResources().openRawResource(R.raw.data);
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String readLine = null;
        StringBuilder sb = new StringBuilder();

        try {

            while ((readLine = br.readLine()) != null) {

            sb.append(readLine);
        }
        sJSON = sb.toString();

        is.close();
        br.close();

        } catch (IOException e) {
            e.printStackTrace();
        }       
    }

    String name = "";
    String type = "";
    String material = "";
    String welding = "";
    String primarybase = "";
    String tipmaterial = "";
    String shape = "";
    String shellcoating = "";

    ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();

    try{
        JSONObject jObject = new JSONObject(sJSON);
        JSONArray  pluginfo = jObject.getJSONArray("parts");

        for(int i=0; i < pluginfo.length(); i++) {
            JSONObject array = pluginfo.getJSONObject(i);

            name = array.getString("name");
            type = array.getString("type");
            material = array.getString("material");
            welding = array.getString("welding");
            primarybase = array.getString("primarybase");
            tipmaterial = array.getString("tipmaterial");
            shape = array.getString("shape");
            shellcoating = array.getString("shellcoating");

            HashMap<String, String> list = new HashMap<String, String>();
            JSONObject e = pluginfo.getJSONObject(i);

            list.put("id",  String.valueOf(i));
            list.put("name", "Plug name: " + e.getString("name"));
            list.put("type", "Type: " +  e.getString("type"));
            mylist.add(list);

            }
        }

    catch(JSONException e){
         Log.e("log_tag", "Error parsing data "+e.toString());
    }

    ListAdapter adapter = new SimpleAdapter(this, mylist , R.layout.list_item,
            new String[] { "name", "type" },
            new int[] { R.id.item_name, R.id.item_type });

    setListAdapter(adapter);

    final Intent intent1 = new Intent(getApplicationContext(), TutViewerActivity.class);

    intent1.putExtra("name", name);
    intent1.putExtra("type", type);
    intent1.putExtra("material", material);
    intent1.putExtra("welding", welding);
    intent1.putExtra("primarybase", primarybase);
    intent1.putExtra("tipmaterial", tipmaterial);
    intent1.putExtra("shape", shape);
    intent1.putExtra("shellcoating", shellcoating);

    final ListView lv = getListView();
    lv.setTextFilterEnabled(true);
    lv.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            startActivity(intent1);
        }
    });
}

}

そして 2 番目のアクティビティ Java:

public class TutViewerActivity extends ListActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();

        Bundle extras = getIntent().getExtras();

        String name = extras.getString("name");
        String type = extras.getString("type");
        String material = extras.getString("material");
        String welding = extras.getString("welding");
        String primarybase = extras.getString("primarybase");
        String tipmaterial = extras.getString("tipmaterial");
        String shape = extras.getString("shape");
        String shellcoating = extras.getString("shellcoating");

        TextView itemName = (TextView)findViewById(R.id.item_name);
        TextView itemType = (TextView)findViewById(R.id.item_type);
        TextView itemMaterial = (TextView)findViewById(R.id.item_material);
        TextView itemWelding = (TextView)findViewById(R.id.item_welding);
        TextView itemPrimarybase = (TextView)findViewById(R.id.item_primarybase);
        TextView itemTipmaterial = (TextView)findViewById(R.id.item_tipmaterial);
        TextView itemShape = (TextView)findViewById(R.id.item_shape);
        TextView itemShellcoating = (TextView)findViewById(R.id.item_shellcoating);

        itemName.setText(name);
        itemType.setText(type);
        itemMaterial.setText(material);
        itemWelding.setText(welding);
        itemPrimarybase.setText(primarybase);
        itemTipmaterial.setText(tipmaterial);
        itemShape.setText(shape);
        itemShellcoating.setText(shellcoating);

    }
}

名前フィールドとタイプ フィールドの両方が最初のページに入力されます。残りの情報「マテリアル」-「シェルコーティング」を取得する必要があります。クリックしたアイテムに渡され、それを配列として次のアクティビティに渡します。

logcat エラー:

11-06 00:42:07.585: E/AndroidRuntime(3122): FATAL EXCEPTION: main
11-06 00:42:07.585: E/AndroidRuntime(3122): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mamlambo.tutorial.tutlist/com.mamlambo.tutorial.tutlist.TutViewerActivity}: java.lang.NullPointerException
11-06 00:42:07.585: E/AndroidRuntime(3122):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
11-06 00:42:07.585: E/AndroidRuntime(3122):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
11-06 00:42:07.585: E/AndroidRuntime(3122):     at android.app.ActivityThread.access$600(ActivityThread.java:130)
11-06 00:42:07.585: E/AndroidRuntime(3122):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
11-06 00:42:07.585: E/AndroidRuntime(3122):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-06 00:42:07.585: E/AndroidRuntime(3122):     at android.os.Looper.loop(Looper.java:137)
11-06 00:42:07.585: E/AndroidRuntime(3122):     at android.app.ActivityThread.main(ActivityThread.java:4745)
11-06 00:42:07.585: E/AndroidRuntime(3122):     at java.lang.reflect.Method.invokeNative(Native Method)
11-06 00:42:07.585: E/AndroidRuntime(3122):     at java.lang.reflect.Method.invoke(Method.java:511)
11-06 00:42:07.585: E/AndroidRuntime(3122):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
11-06 00:42:07.585: E/AndroidRuntime(3122):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-06 00:42:07.585: E/AndroidRuntime(3122):     at dalvik.system.NativeStart.main(Native Method)
11-06 00:42:07.585: E/AndroidRuntime(3122): Caused by: java.lang.NullPointerException
11-06 00:42:07.585: E/AndroidRuntime(3122):     at com.mamlambo.tutorial.tutlist.TutViewerActivity.onCreate(TutViewerActivity.java:62)
11-06 00:42:07.585: E/AndroidRuntime(3122):     at android.app.Activity.performCreate(Activity.java:5008)
11-06 00:42:07.585: E/AndroidRuntime(3122):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
11-06 00:42:07.585: E/AndroidRuntime(3122):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
11-06 00:42:07.585: E/AndroidRuntime(3122):         ... 11 more

これを簡単に行う方法について何か考えはありますか?ありがとう。

4

2 に答える 2

2

変数が必要なくても現在のアクティビティ全体で値が変更されない限り、メソッドの外部で変数をインスタンス化します。これにより、メソッド間で変数値を渡すことができます。

String material;

解析の簡略化されたバージョンは次のJSONArrayとおりです。

for(i=0; i < jArray.length(); i++) {
    JSONObject jObject = jArray.getJSONObject(i);
    material = jObject.getString("material");
}

を使用してIntent、上記の「マテリアル」文字列を次のアクティビティに渡します。

Intent passJSONIntent = new Intent(CurrentActivity.this, NextActivity.class);
passJSONIntent.putExtra("material", material);
startActivity(passJSONIntent);

からExtraを取得IntentNextActivityますonCreate()

Bundle extras = getIntent().getExtras();
String material = extras.getString("material");
TextView itemType = (TextView)findViewById(R.id.item_type);
itemType.setText(material);

編集:

さて、今あなたが見逃しているのはsetContentView(R.layout.yourLayout);

public class TutViewerActivity extends ListActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.yourLayout);

        ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();

        Bundle extras = getIntent().getExtras();

        //etc...
于 2012-11-16T14:12:54.407 に答える
-1

あなたが何を望んでいるのかを説明するために疑似コードを入れることができますか?

あなたが探しているかどうかはわかりません:

myList.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> a, View v, int position, long id) {


                Intent intent = new Intent(MYCLASS.this, NEXTACTIVITYCLASS.class);
                Bundle b = new Bundle();
                //TRY TO DECODE JSON
                String myJsonString = decodeMYJSON(MYJSON);

                b.putString("JSON",myJsonString);
                intent.putExtras(b); 
                startActivity(intent);

                                          }});
于 2012-11-16T13:43:51.503 に答える