Как исправить «Системные сервисы, недоступные для Операции до onCreate» при передаче значений между классами и обновлении представления переработчика? - PullRequest
0 голосов
/ 07 октября 2019

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

Я пытался создать метод set в классе MainActivty, я также пытался добавить намерение extra, но я не верю, что полностьюпонять еще лучше.

Класс MainActivity:

public class MainActivity extends AppCompatActivity implements MyRecyclerViewAdapter.ItemClickListener {
    private RecyclerView recyclerView;
    private RecyclerView.Adapter mAdapter;
    private RecyclerView.LayoutManager layoutManager;
    public  ArrayList<String> orderList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);


        // set up the RecyclerView
        recyclerView = findViewById(R.id.recyle_view_activity);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        mAdapter = new MyRecyclerViewAdapter(this, orderList);
        ((MyRecyclerViewAdapter) mAdapter).setClickListener(this);


        recyclerView.addItemDecoration(new DividerItemDecoration(this,
                DividerItemDecoration.VERTICAL));


        recyclerView.setAdapter(mAdapter);


    }

    //This is the set method I attempted:
    public void setOrderAdd(ArrayList<String> data){
        if (data != null){
           mAdapter = new MyRecyclerViewAdapter(this,data); //Error refrences here
        }
    }
}

Другой класс:

public class regularCoffee extends AppCompatActivity implements AdapterView.OnItemSelectedListener, Serializable {
   protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_regular_coffee);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        addToOrder();

}

public void addToOrder(){
        //Reg Addons:
        final CheckBox leaveRoomReg = findViewById(R.id.leave_room_reg);
        final CheckBox cinnamonReg = findViewById(R.id.cinnamon_reg);
        final CheckBox chocolateSyrupReg = findViewById(R.id.chocolate_syrup_reg);
        final CheckBox whiteChocolateSyrupReg = findViewById(R.id.white_chocolate_syrup_reg);
        final CheckBox caramelReg = findViewById(R.id.caramelReg);
        final CheckBox hazelnutReg = findViewById(R.id.hazel_nut_reg);

        final CheckBox[] RegCoffeeAddOns = {leaveRoomReg,cinnamonReg,chocolateSyrupReg,whiteChocolateSyrupReg,caramelReg,hazelnutReg};

        //Decaf Addons:
        final Button leaveRoomDecaf = findViewById(R.id.leave_room_decaf);
        final Button cinnamonDecaf = findViewById(R.id.cinnamon_decaf);
        final Button chocolateSyrupDecaf = findViewById(R.id.chocolate_syrup_decaf);
        final Button whiteChocolateDecaf = findViewById(R.id.white_chocolate_syrup_decaf);
        final Button caramelDecaf = findViewById(R.id.caramel_decaf);
        final Button hazelnutDecaf = findViewById(R.id.hazel_nut_decaf);

        final Button[] DecafCoffeeAddOns = {leaveRoomDecaf,cinnamonDecaf,caramelDecaf,chocolateSyrupDecaf,whiteChocolateDecaf,hazelnutDecaf};

        Button addToOrderButton = findViewById(R.id.addToOrderReg);



        addToOrderButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MainActivity addToOrderArea = new MainActivity();
                String forOrder;
                ArrayList<String> tempArray = new ArrayList<>();

                if (regCoffeeQuantity > 0){
                    forOrder = "Regular Coffee (x" + regCoffeeQuantity + ") \n   ";
                    for (int i = 0; i < RegCoffeeAddOns.length; i++){
                        if (RegCoffeeAddOns[i].isChecked()){
                            forOrder = forOrder + "| " + RegCoffeeAddOns[i].getText().toString() + " ";
                            System.out.println(forOrder);
                        }
                    }

                   addToOrderArea.setOrderAdd(tempArray); //Error refrences here

                }
            }
        });
    }

Адаптер RecyclerView:

package com.example.holygroundsapplication;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder> {

    private List<String> mData;
    private LayoutInflater mInflater;
    private ItemClickListener mClickListener;

    // data is passed into the constructor
    MyRecyclerViewAdapter(Context context, List<String> data) {
        this.mInflater = LayoutInflater.from(context); //Error refrences here.
        this.mData = data;
    }


    // inflates the row layout from xml when needed
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.recyclerview_row, parent, false);
        return new ViewHolder(view);

    }

    // binds the data to the TextView in each row
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        String animal = mData.get(position);
        holder.myTextView.setText(animal);
    }

    // total number of rows
    @Override
    public int getItemCount() {
        return mData.size();
    }


    // stores and recycles views as they are scrolled off screen
    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView myTextView;

        ViewHolder(View itemView) {
            super(itemView);
            myTextView = itemView.findViewById(R.id.tvAnimalName);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
        }
    }

    // convenience method for getting data at click position
    String getItem(int id) {
        return mData.get(id);
    }

    // allows clicks events to be caught
    void setClickListener(MainActivity itemClickListener) {
        this.mClickListener = itemClickListener;
    }

    // parent activity will implement this method to respond to click events
    public interface ItemClickListener {
        void onItemClick(View view, int position);
    }
}

Этоошибка:

 java.lang.IllegalStateException: System services not available to Activities before onCreate()
        at android.app.Activity.getSystemService(Activity.java:5774)
        at android.view.LayoutInflater.from(LayoutInflater.java:233)
        at com.example.holygroundsapplication.MyRecyclerViewAdapter.<init>(MyRecyclerViewAdapter.java:21)
        at com.example.holygroundsapplication.MainActivity.setOrderAdd(MainActivity.java:89)
        at com.example.holygroundsapplication.regularCoffee$8.onClick(regularCoffee.java:262)
...

Ответы [ 2 ]

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

Я думаю, что вы логически должны заменить

MainActivity addToOrderArea = new MainActivity();

на

MainActivity addToOrderArea = MainActivity.this;

Но так как вы не в том же классеВы должны передать ссылку соответственно. Пока MainActivity все еще активна, а другой класс - всего лишь помощник, который не будет проблемой. Просто добавьте MainActivity ко всем конструкторам ... Примерно так:

OtherClass{
    private MainClass addToOrderArea;
    public OtherClass(MainClass addToOrderArea){
        this.addToOrderArea=addToOrderArea;
    }

    // ...

    abstract class MyOnclicklistener extends View.OnClickListene{
        private MainClass addToOrderArea;
        public MyOnclicklistener(MainClass addToOrderArea){
            this.addToOrderArea=addToOrderArea;
        }
    }

    // ...

    addToOrderButton.setOnClickListener(new MyOnclicklistener(this.addToOrderArea) {
        @Override
        public void onClick(View v) {
            String forOrder;
            ArrayList<String> tempArray = new ArrayList<>();

            if (regCoffeeQuantity > 0){
                forOrder = "Regular Coffee (x" + regCoffeeQuantity + ") \n   ";
                for (int i = 0; i < RegCoffeeAddOns.length; i++){
                    if (RegCoffeeAddOns[i].isChecked()){
                        forOrder = forOrder + "| " + RegCoffeeAddOns[i].getText().toString() + " ";
                        System.out.println(forOrder);
                    }
                }

               addToOrderArea.setOrderAdd(tempArray); //Error refrences here

            }
        }
    });
}

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

Вероятно, сохраняйте переменную только между двумя действиями, что кажется нормальным. Обновление представления переработчика непосредственно из другого действия, однако, может привести к появлению некоторых представлений Android или ошибок безопасности. Я бы сказал, просто передайте переменную и позже обновите представление recycler в функции onResume. Примерно так:

private ArrayList<String> _data;

public void setOrderAdd(ArrayList<String> data){
    if (data != null){
        // only store variable
        _data = data;
    }
}

@Override
protected void onResume() {
    super.onResume();
    // make update of your viewing components here
    if(_data!=null){
        mAdapter = new MyRecyclerViewAdapter(this,_data);
    }
}

Теперь все должно работать, я думаю

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

В вашей функции onClick у вас есть

MainActivity addToOrderArea = new MainActivity();

Вы не должны создавать экземпляры активности самостоятельно. Это то, что делает система Android. Поскольку вы сами создаете действие, оно не инициализируется (т. Е. onCreate() не вызывается). Адаптер, созданный в setOrderAdd(), требует инициализации действия и, следовательно, выдает исключение.

Чтобы избежать этих проблем, необходимо создать действие с помощью startActivity(). Вы можете передать свои данные в новое задание, добавив дополнительные данные в начальное намерение.

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