onsave/onpause сохранять данные, созданные из одного действия в другое

Я очень новичок в программировании, просто хобби выходного дня. Я хочу создать приложение, похожее на интерактивный календарь, в основном оно работает так.

Основное действие отображает календарь, в котором вы можете нажать на дату, и будет запущено новое действие. В этом новом действии вы можете выбрать категорию для своего элемента, и кнопка ImageButton будет добавлена ​​к дате календаря при выборе категории. После того, как кнопка была размещена, вы можете нажать на нее и установить дополнительную информацию (будильник, место, детали и т. д.).

Я дошел до того, что сделал весь макет календаря, кнопки для различных действий и динамически добавлял дату календаря ImageButton, но я зашел в тупик, как сохранить данные (ImageButton), добавленные пользователем; 'Нажатие кнопки 1 в ActivityB (например, спортивной дате) создает кнопку динамического изображения бейсбольного мяча в макете ActivityA (календарь), поэтому мой вопрос заключается в том, как сохранить эти данные навсегда (могут быть удалены пользователем).

Последние несколько дней я читал Onpause, onSaveinstancestate, onConfiguration, SQL, фрагменты и базу данных. Но я не могу понять, как это применить, не говоря уже о том, чтобы применить его к объекту действия, созданному из другого действия, я был бы очень признателен за любое понимание.

Мой код для действия с кнопкой, которая создает динамическую кнопку:

 package org.iimed.www;




    import android.os.Bundle;


    import android.view.View;
    import android.view.View.OnClickListener;

    import android.widget.Button;
    import android.widget.ImageButton;
    import android.widget.LinearLayout;

    import org.iimed.www.Sundayopen;
    import android.widget.RelativeLayout;
    import android.widget.TableLayout.LayoutParams;




    import android.app.Activity;
    import android.content.Intent;

    import android.graphics.Color;
    import android.graphics.drawable.Drawable;


        public class Penicillins extends Activity implements OnClickListener {

            ImageButton addmed,ab;
            RelativeLayout ll;




                public void onCreate(Bundle SavedInstanceState){
                     super.onCreate(SavedInstanceState);  
                     setContentView(R.layout.penicillin);
                     addmed =( ImageButton)findViewById(R.id.addmed);

                addmed.setOnClickListener(this);




                }
                public void onClick(View v) {

                    switch (v.getId()){

                    case R.id.addmed:


                         setContentView(R.layout.sundayopen);

                        ll =(RelativeLayout) findViewById(R.id.sundayopen); 




    android.widget.LinearLayout.LayoutParams b = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);

    int i = 0;
                ab = new ImageButton(this);

                ab.setImageResource(R.drawable.adaba);  
                ab.setBackgroundColor(Color.TRANSPARENT);
                ab.setLayoutParams(b);
                ab.setId(i) ;
                ab.getId();
                ab.setTag(1);
            ll.addView(ab);

                }


                }



                    }




My code for the activity the button appears in:



package org.iimed.www;



import java.util.ArrayList;

import android.R.string;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.app.Activity;

import android.content.Intent;

import android.view.View;


import android.widget.ImageButton;
import android.widget.RelativeLayout;


import android.view.View.OnClickListener;
public class Sundayopen extends Activity implements OnClickListener {   


    public static final Integer [] aba = {R.id.aba};

ImageButton ab;










public void onCreate(Bundle SavedInstanceState) {
  super.onCreate(SavedInstanceState);
              setContentView(R.layout.sundayopen);
         ImageButton hb1 = (ImageButton) findViewById(R.id.homebutton1);
         RelativeLayout  ll =(RelativeLayout) findViewById(R.id.sundayopen);
         ImageButton sbc = (ImageButton) findViewById(R.id.satlidopen);
         ImageButton abb = (ImageButton) findViewById(R.id.abbutton);
         sbc.setOnClickListener(this);
         hb1.setOnClickListener(this);
         abb.setOnClickListener(this);
        }





         public void onClick(View v){
             switch (v.getId()) {
             case R.id.homebutton1:
                startActivity(new Intent(this, MainActivity.class));
                 break;
             case R.id.satlidopen:
                 MediaPlayer media = MediaPlayer.create(Sundayopen.this, R.raw.openlid);
                 media.start();
                startActivity(new Intent(this,Iimedja.class));
                break;
             case R.id.abbutton:

                    startActivity(new Intent(this, ImageTextListViewActivity.class));

             }
         }





}

person ToeKnee    schedule 03.11.2013    source источник


Ответы (1)


Я считаю, что вы спрашиваете здесь две разные вещи:

  1. Как передавать данные между Activities (и как восстанавливать действия)
  2. Как сохранить данные навсегда в вашем приложении

Для первого есть несколько примеров. Проверьте этот ответ здесь. Мне кажется, то, что вы читали о восстановлении Activities, не то, что вы хотите делать (по крайней мере, пока). Когда Android нужно освободить память, он может убить ваш Activities, хорошее приложение сохранит текущий статус Activity на onSaveInstanceState() (т. е. оно сохранит данные, которые хочет восстановить, когда Activity снова запустится в Bundle). Посетите веб-сайт для разработчиков Android по этому адресу.

Что касается второго, вам нужно будет сохранить данные в памяти устройства (SQLite, файловая система или SharedPreferences). Таким образом, в основном вы должны сохранить данные, которые хотите восстановить, которые, согласно вашему объяснению, должны быть группой:

  • Дата
  • Категория
  • Время будильника
  • Место
  • Подробности

На вашем месте я бы создал базу данных SQLite с одним Table, содержащим Columns, которые вы хотите сохранить. Сохраняйте данные при добавлении нового элемента в календарь и загружайте данные всех элементов при запуске приложения.

person momo    schedule 03.11.2013
comment
Сохранит ли это динамически созданный ImageButton в действии 1, созданном из действия 2? да, я смотрел на этот пример раньше, но я просто не понимаю, как я могу применить его для получения / установки ImageButton, для этого нет функции, могу ли я как-то назначить строку или int динамической кнопке? также используя этот метод, как мне управлять параметрами кнопки? например, куда он идет? - person ToeKnee; 03.11.2013
comment
Не существует простого способа сохранить такие компоненты, как кнопки. Все, что вы хотите сохранить, нужно будет сохранить как примитивы (строки, целые числа,...). Я думаю, что подход БД имеет больше смысла в вашем случае, для сохранения одной из ваших кнопок потребуется сохранить все связанные данные, а затем, вернувшись к действию 1, вы загрузите все кнопки из БД и создадите их. Как только вы загрузите эти данные, вы будете знать, в какой дате находится эта кнопка и какой значок показывать, вы также будете знать всю информацию (подробности и т. д.), которую вы хотите показать при нажатии, поэтому вы просто создаете прослушиватель для их отображения. - person momo; 03.11.2013
comment
Большое спасибо, приятель, я сейчас немного не в себе, так запутался. Есть ли какие-либо примеры использования такой базы данных, на которые вы могли бы сослаться? Или руководства для начинающих? или что-нибудь определенное о методе, который мне нужен, или он действительно так не работает? - person ToeKnee; 03.11.2013
comment
Этот пример, вероятно, поможет вам stackoverflow.com/a/12015869/801913 или просто найдите в Google руководство по sqlite для Android. - person momo; 04.11.2013
comment
Спасибо, Момо, я определенно буду использовать это для своей даты, категории, времени будильника, места, деталей, но я все еще не могу прорваться через сохранение этой вещи ImageButton. В своем ответе вы говорите, что onSave и onRestore - это не то, что я хочу использовать, но приведенный вами пример касается помещения int в пакет и его размещения/получения, но я не могу поместить динамический ImageButton, подобный этому ` ab=new ImageB ab.setImageResource(R.drawable.adaba);,ab.setBackgroundColor(Color.TRANSPARENT);,ab.setLayoutParams(b);ab.setId(i);,ab.getId(); ,ll.addView(ab);'со всеми настройками - person ToeKnee; 04.11.2013
comment
Продолжение: как int положить в бандл. Я не могу найти ни одного примера динамической кнопки, созданной в другом действии, сохраняя ее как постоянную, и все примеры/темы SQL просто добавляют и восстанавливают строки текста. - person ToeKnee; 04.11.2013