Android: передача дополнительных данных из одного действия в другое действие

#android

#Android

Вопрос:

У меня есть файл JSON, который заполняется для действия (Main.java ).

Это действие показывает 3 случайных изображения из URL в моих записях JSON.

Что я хочу сделать, так это: у меня есть 13 разных записей в my JSON, всякий раз, когда я нажимаю на показанную случайную картинку, она переходит к другому действию (ProjectDetail.java ) содержание изображения, заголовка и описания зависит от элемента, который я нажимаю, на основе его записи в JSON.

Что у меня есть, так это использование extra by Я не знаю точно, как это выполнить, поскольку я использую JSON. Что я должен добавить в мой top_listener метод в моем основном классе и что я должен добавить в мой класс ProjectDetail?

Спасибо.

Main.java

    public class Main extends Activity {
            /** Called when the activity is first created. */

            ArrayList<Project> prjcts=null;
            private ImageThreadLoader imageLoader = new ImageThreadLoader();
            private final static String TAG = "MediaItemAdapter";


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

                prjcts = new ArrayList<Project>();
                WebService webService = new WebService("http://liebenwald.spendino.net/admanager/dev/android/projects.json");
                Map<String, String> params = new HashMap<String, String>();
                params.put("var", "");
                String response = webService.webGet("", params);

                try
                {
                    Type collectionType = new TypeToken<ArrayList<Project>>(){}.getType();
                    List<Project> lst= new Gson().fromJson(response, collectionType);
                    for(Project l : lst)
                    {
                        prjcts.add(l);
                        ConstantData.projectsList.add(l);
                    }
                }
                catch(Exception e)
                {
                    Log.d("Error: ", e.getMessage());
                }

                final Button project = (Button) findViewById(R.id.btn_projectslist);
                final Button infos = (Button) findViewById(R.id.btn_infos);
                final Button contact = (Button) findViewById(R.id.btn_contact);
                project.setOnClickListener(project_listener);
                infos.setOnClickListener(infos_listener);
                contact.setOnClickListener(contact_listener);

                ImageView image1;
                ImageView image2;
                ImageView image3;

                try {
                    image1 = (ImageView)findViewById(R.id.top1);
                    image2 = (ImageView)findViewById(R.id.top2);
                    image3 = (ImageView)findViewById(R.id.top3);
                  } catch( ClassCastException e ) {
                    Log.e(TAG, "Your layout must provide an image and a text view with ID's icon and text.", e);
                    throw e;
                  }


                  Bitmap cachedImage1 = null;
                  Bitmap cachedImage2 = null;
                  Bitmap cachedImage3 = null;

                  //randomize the index of image entry

                  int max = prjcts.size();
                  List<Integer> indices = new ArrayList<Integer>(max);
                  for(int c = 0; c < max;   c)
                  {
                      indices.add(c);
                  }

                  int arrIndex = (int)((double)indices.size() * Math.random());
                  int randomIndex1 = indices.get(arrIndex);
                  indices.remove(arrIndex);


                  int randomIndex2 = indices.get(arrIndex);
                  indices.remove(arrIndex);


                  int randomIndex3 = indices.get(arrIndex);
                  indices.remove(arrIndex);



                  setImage(cachedImage1, image1, prjcts.get(randomIndex1));
                  setImage(cachedImage2, image2, prjcts.get(randomIndex2));
                  setImage(cachedImage3, image3, prjcts.get(randomIndex3));

                  image1.setOnClickListener(top_listener);
                  image2.setOnClickListener(top_listener);
                  image3.setOnClickListener(top_listener);
            }



            public void setImage(Bitmap cachedImage, final ImageView image, Project pro)
            {
                //Bitmap cachedImage1 = null;
                try {
                    cachedImage = imageLoader.loadImage(pro.smallImageUrl, new ImageLoadedListener() 
                    {
                        public void imageLoaded(Bitmap imageBitmap)
                        {
                            image.setImageBitmap(imageBitmap);
                            //notifyDataSetChanged();                
                        }
                    });
                } catch (MalformedURLException e) {
                    Log.e(TAG, "Bad remote image URL: "   pro.smallImageUrl, e);
                }
                if( cachedImage != null ) {
                    image.setImageBitmap(cachedImage);
                  }
            }


            private OnClickListener top_listener = new OnClickListener() {
                public void onClick(View v) {
                            Intent top = new Intent(Main.this, InfosActivity.class);
                            startActivity(top);
                }
                };
  

ProjectDetail.java

 public class ProjectDetail extends Activity implements OnClickListener{


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

        Button weitersagen = (Button) findViewById(R.id.btn_weitersagen);
        weitersagen.setOnClickListener(this);

        Button sms = (Button) findViewById(R.id.btn_sms_spenden);
        sms.setOnClickListener(this);

        int position = getIntent().getExtras().getInt("spendino.de.ProjectDetail.position");
        Project project = ConstantData.projectsList.get(position);


      try {
          ImageView projectImage = (ImageView)findViewById(R.id.project_image);
          Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL(project.bigImageUrl).getContent());
          projectImage.setImageBitmap(bitmap); 
        } catch (MalformedURLException e) {
          e.printStackTrace();
        } catch (IOException e) {
          e.printStackTrace();
        } 

      TextView project_title = (TextView)findViewById(R.id.txt_project_title);
      project_title.setText(project.project_title);

      TextView organization_title = (TextView)findViewById(R.id.txt_organization_title);
      organization_title.setText(Html.fromHtml("von "  project.organization_title));

      TextView project_description = (TextView)findViewById(R.id.txt_project_description);
      project_description.setText(Html.fromHtml(project.project_description));

    }
  

У меня также есть это ConstantData.java , индекс, который содержит мои свойства JSON:

  public class ConstantData{

   public static String project_title = "project title";
   public static String organization_title = "organization title";
   public static String keyword = "keyword";
   public static String short_code = "short code";
   public static String project_description = "description";
   public static String smallImageUrl = "smallImageUrl";
   public static String bigImageUrl = "bigImageUrl";
   public static String price= "price";
   public static String country= "country";



    public static ArrayList<Project> projectsList = new ArrayList<Project>();


    public int describeContents() {
        return 0;
    }

    public void writeToParcel(Parcel out, int flags) {
        out.writeString(project_title);
        out.writeString(organization_title);
        out.writeString(keyword);
        out.writeString(short_code);
        out.writeString(project_description);
        out.writeString(smallImageUrl);
        out.writeString(bigImageUrl);
        out.writeString(price);
        out.writeString(country);
    }

    public static final Parcelable.Creator<ConstantData> CREATOR
            = new Parcelable.Creator<ConstantData>() {
        public ConstantData createFromParcel(Parcel in) {
            return new ConstantData(in);
        }

        public ConstantData[] newArray(int size) {
            return new ConstantData[size];
        }
    };

    private ConstantData(Parcel in) {
        project_title = in.readString();
        organization_title = in.readString();
        keyword = in.readString();
        short_code = in.readString();
        project_description = in.readString();
        smallImageUrl = in.readString();
        bigImageUrl = in.readString();
        price = in.readString();
        country = in.readString();
    }
}
  

Ответ №1:

Вы могли бы сделать класс ConstantData сериализуемым, расширив Parcelable и реализовав пару методов (см. Документацию). Затем вы могли бы передать экземпляр constantData в качестве дополнительного, выполнив

 intent.putExtra("jsonData", constantDataInstance);
  

и извлечение его из другого действия (в его методе onCreate ()) с помощью

 getIntent().getExtras().getParcelable("jsonData");
  

В противном случае вы могли бы просто пропустить как дополнительное каждое поле независимо, но это было бы беспорядочно. Этот способ не только более удобен для чтения и все такое, но и «хорошо разработан».

Комментарии:

1. Я отредактировал свои ConstantData, пожалуйста, взгляните .. тогда с помощью чего следует изменить constantDataInstance? спасибо

2. Насколько я вижу, вы помещаете свои данные json в массив ConstantData, поэтому вы не используете какие-либо другие переменные экземпляра. Вы должны проанализировать json и поместить каждый объект в переменную. Затем вы передаете intent постоянное значение, которое, будучи сериализуемым, несет в себе всю информацию.

3. Понятно, вы все равно можете привести мне пример? Спасибо

4. Ну, допустим, вы преобразуете свои json-данные в массив строк. Затем вы можете выполнить intent.putExtra(«что угодно», array[0]); для каждого объекта в массиве, а затем извлечь его с помощью GetIntent().getExtras().getString(«что угодно»);

Ответ №2:

Чтобы передать информацию из одного действия в другое, когда вы запускаете новое, вы делаете следующее:

     Intent top = new Intent(Main.this, InfosActivity.class);
    Bundle b = new Bundle();
    b.putString("key1", "value2");
    b.putString("key2", "value2");
    b.putString("key3", "value3");
    top.putExtras(b);
    startActivity(top);
  

Затем во вновь запущенном действии в onCreate() введите следующее:

     Bundle b = getIntent().getExtras();
    b.get("key1");
    b.get("key2");
    b.get("key3");
  

При этом будут получены значения из предыдущего действия с помощью предоставленного вами ключа.

Для более сложных объектов вам следует расширить Parcelable (вероятно, то, что вам понадобится), а затем использовать:

 b.putParcelable("Key4", yourParcelableObject);
  

И в вашем onCreate()

 b.getParcelable("Key4");
  

Я надеюсь, что это поможет.

Комментарии:

1. первый способ заключается в том, чтобы вставить значения вручную, верно? Дело в том, что мое значение уже объявлено в JSON. Например: «short_code»: «81190» и я полагаю, что это имеет какое-то отношение к моему классу ConstantData, есть идеи?

2. спасибо. Допустим, мне нужно установить дополнительное (например, key1) в TextView через setText, что я должен указать в качестве аргумента в этом методе? projectitle.setText();

3. текст для textview должен быть извлечен из дополнительного

4. Спасибо. Я решил использовать метод Parcelable, не могли бы вы, пожалуйста, взглянуть на мои отредактированные ConstantData выше. Эхмм, чем я должен заменить ‘yourParcelableObject’?

5. Я все еще не понимаю, что такое мой объект ConstantData, потому что у меня нет ни одного из них внутри моих постоянных данных, и в примере, который вы предоставляете, объект также не объявлен. Объявление ConstantData cd1 = new ConstantData (); в моем основном действии выдает только ошибки.

Ответ №3:

Используйте gson для преобразования json в Java. Затем вы можете использовать Wagon для легкого перемещения дополнительных данных.

GSON:https://github.com/google/gson

Универсал:https://github.com/beplaya/Wagon