Как передать объект в новый вид деятельности в андроид студии? - PullRequest
0 голосов
/ 14 октября 2019

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

Это мой основной класс

    public class MainActivity extends AppCompatActivity {
    Item item;

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

        Button buttonOne = findViewById(R.id.itemButton);
        buttonOne.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(), ViewItemDetails.class);
                Bundle bundle = new Bundle();
                bundle.putSerializable("item", item);
                intent.putExtras(bundle);
                startActivity(intent);

            }
        });

    }

    void createNewItem(){
        item=new Item("Pixel 4","https://google.com",1000.00);
    }
}

Это действие, к которому я пытаюсь перейти:

    public class ViewItemDetails extends AppCompatActivity {

    Intent intent= getIntent();
    Bundle bundle= intent.getExtras();
    Item item = (Item) bundle.getSerializable("item");

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_item_details);
        setStrings();
        setButtons();
    }
    void setStrings() {
        try {
            TextView nameTextView = findViewById(R.id.itemNameid);
            nameTextView.setText(item.getItemName());

            TextView itemInitTV = findViewById(R.id.initalPriceNumID);
            itemInitTV.setText(Double.toString(item.getInitPrice()));

            TextView itemCurrTV = findViewById(R.id.currentPriceNumid);
            itemCurrTV.setText(Double.toString(item.getCurrentPrice()));
        }catch (NullPointerException e){
            //do noting
        }
    }

    void setButtons(){
        Button buyButton = findViewById(R.id.buyButtonid);
        buyButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Uri uriUrl = Uri.parse(item.getWebaddress());
                Intent launchBrowser = new Intent(Intent.ACTION_VIEW, uriUrl);
                startActivity(launchBrowser);
            }
        });

        Button refreshButton= findViewById(R.id.refrechId);
        refreshButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Double newPrice= new GenerateNewPrice().GenerateNewPrice(item.getWebaddress());
                Toast toast = Toast.makeText(getApplicationContext(),Double.toString(newPrice), Toast.LENGTH_SHORT);
                toast.show();
            }
        });

        Button editButton= findViewById(R.id.editid);
        editButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                Toast toast = Toast.makeText(getApplicationContext(),"Attempt to edit", Toast.LENGTH_SHORT);
                toast.show();
            }
        });

    }
}

Это объект, который я пытаюсь передать между действиями.

    public class Item implements Serializable {
    String itemName, webaddress;
    Double initPrice, CurrentPrice;

    public Item(String itemName, String webaddress, Double initPrice) {
        this.itemName = itemName;
        this.webaddress = webaddress;
        this.initPrice = initPrice;
    }

    public String getItemName() {
        return itemName;
    }

    public String getWebaddress() {
        return webaddress;
    }

    public Double getInitPrice() {
        return initPrice;
    }

    public Double getCurrentPrice() {
        return CurrentPrice;
    }
 }

Когда я запускаю приложение на своемТелефон Я нажимаю кнопку, а затем приложение закрывается.

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

Ответы [ 5 ]

1 голос
/ 14 октября 2019

неверная инициализация пакета и элемента в действии ViewItemDetails.java. Попробуйте выполнить инициализацию внутри метода onCreate и дайте нам знать ..

1 голос
/ 14 октября 2019

На данный момент и для будущей помощи по SOF, помните, журналы ошибок всегда полезны в такого рода сценариях.

Хотя, вот некоторые моменты ..

  • Вы должны следовать правилу жизненного цикла Activity, неплохо было бы получить данные в onCreate().
  • Вы должны использовать Parcelable вместо Serializable. Это гораздо эффективнее.
0 голосов
/ 14 октября 2019

Вы можете использовать GSON для преобразования вашего объекта в формат JSON

Intent intent = new Intent(this, ProjectActivity.class);
intent.putExtra("item", new Gson().toJson(item));
startActivity(intent);

, затем во втором упражнении убедитесь, что вы правильно инициализировали пакет в жизненном цикле onCreate ().

Item item;

@Override
protected void onCreate(Bundle savedInstanceState) {
    .........
    Bundle extras = getIntent().getExtras();
    if (extras != null) {
        item = new Gson().fromJson(extras.getString("item"), Item.class);
    }

Примечание. Я читал это в статье, в которой Google рекомендует использовать GSON при передаче объектов в связке.

0 голосов
/ 14 октября 2019

Вы должны инициализировать этот код в методе onCreate (), как показано ниже:

Item item;

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

Intent intent= getIntent();
Bundle bundle= intent.getExtras();
item = (Item) bundle.getSerializable("item");

setStrings();
setButtons();

}

0 голосов
/ 14 октября 2019

Похоже, у вас есть какая-то ошибка, она должна сработать, вы можете проверить один из примеров работы над проектом // создание буфера

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            //String selectedItem = (String) adapterView.getItemAtPosition(i);
            //getting dat from text view and converting to string
           // String textview =((TextView)view.findViewById(R.id.textViewName)).getText().toString();
            //Toast.makeText(DriverInfo.this,"Driver id "+driver_id,Toast.LENGTH_SHORT).show();
            Bundle bundle=new Bundle();
            bundle.putString("DriverID",driver_id);
            bundle.putString("Route",loc_src);
            bundle.putString("Dest",loc_dest);
            bundle.putString("location_address",location_address);
            Toast.makeText(DriverInfo.this, "Driver ID="+driver_id, Toast.LENGTH_SHORT).show();
            Intent intent=new Intent(DriverInfo.this, DirverCurrentLoc.class);
            intent.putExtras(bundle);
            startActivity(intent);

        }
    });

// Получение данных пакета

 String lat, lng, realtime,src,dest;
     location_address=intent.getStringExtra("location_address");
        driver_id=intent.getStringExtra("DriverID");
        src=intent.getStringExtra("Route");
        dest=intent.getStringExtra("Dest");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...