Передача данных из действия во фрагмент с использованием интерфейса - PullRequest
0 голосов
/ 15 января 2019

С моим приложением у меня есть элемент управления Picker (во фрагменте), когда пользователь щелкает по нему, новое действие меню будет отображаться со списком некоторых элементов. Когда пользователь нажимает на любой элемент, действие будет завершено, и интерфейс должен передать выбранную строку элемента. сборщику снова во фрагменте,

Вот мое меню Активность:

public class Menu extends AppCompatActivity {

    ListView listView;


    public interface ItemListener {
        void getItem(String s);
    }


    ItemListener itemListener;


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

        // Error Goes Here

        itemListener = (ItemListener) this;

        // Define and fill the list view

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                itemListener.getItem("Some Item");
                finish();

            }
        });
    }
}

И мой фрагмент:

public class Addorder extends Fragment implements Menu.ItemListener {


    Picker picker;



    public Addorder() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        view = inflater.inflate(R.layout.fragment_addorder, container, false);

        picker = (Picker) view.findViewById(R.id.picker);


        return view;
    }


    @Override
    public void getItem(String s) {
        picker.setChosenItem(s);
    }
}

Но я получаю ошибку Кастинга:

Caused by: java.lang.ClassCastException: Menu cannot be cast to Menu$ItemListener

То, что я Донг Неправильно, Любая помощь будет высоко ценится

Ответы [ 2 ]

0 голосов
/ 16 января 2019

На мой взгляд, слушатель бесполезен.В Addorder вы должны открыть меню деятельности с startActivityForResult().После установки результата в Menu вы получите его в обратном вызове onActivityResult фрагмента.Вот пример, как это сделать: Как управлять startActivityForResult на Android?

0 голосов
/ 15 января 2019

Из ваших комментариев сейчас стало более понятно, что вы пытаетесь сделать.Fragment сильно зависит от Activity, на самом деле он не может оставаться в одиночестве, и любая реализация интерфейса будет перехвачена во время onAttach(), контекст Fragment равен Activity, поэтому, если Activity не реализует интерфейссбой произойдет в onAttach() во фрагменте.

Но в вашем сценарии у вас есть два разных Activities, поэтому в этом случае вы можете передавать данные, используя Bundle или BroadcastReceiver.Чтобы использовать BroadcastReciver, создайте метод внутри вашего Fragment:

private void registerReciver() {
BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent != null) {
                String getData = intent.getStringExtra("data");
            }
    }
};
IntentFilter intentFilter = new IntentFilter("action");
this.registerReceiver(receiver, intentFilter);

}

Вызовите registerReciver(); в вашем фрагменте onCreate() метод.Теперь со второго Activity, где он закрывается, запускается BroadcastReceiver, отправляющий некоторые данные:

                        Intent intent = new Intent();
                        intent.putExtra("data", "some data");
                        intent.setAction("action");
                        this.sendBroadcast(intent);

Второй способ, который также должен работать в вашем методе Fragment override onResume, который будет вызываться послеваша Activity секунда Activity заканчивается.В Activity введите данные в Bundle, например:

Addorder fragment = new Addorder();
Bundle bundle = new Bundle();
bundle.putString("data", "Some data");
fragment.setArguments(bundle);

Чем внутри Fragment в onResume() метод получить данные:

Bundle bundle = this.getArguments();
if (bundle != null) { //to prevent crash must check against null
    String getData = bundle.getString("data", defaultValue);
 }

Я думаю, что оба способа должны работать

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