#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