Вернуться к списку действий из основной деятельности? - PullRequest
0 голосов
/ 12 октября 2018

Я хочу MainActivity вызвать SecondActivity, а SecondActivity вернуть список строк.

Каждый прочитанный мной ответ объясняет, как передавать данные из MainActivity в SecondActivity.

Я создал действие, которое рассчитывает все возможные IP-адреса во внутренней сети и сохраняет их в списке.Я хочу передать этот список MainActivity.Не могли бы вы предложить мне несколько ссылок или код для решения моей проблемы?Я совершенно новичок в Android Studio, но я должен это сделать.Вот фрагмент кода из MainActivity

 b1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    boolean check_conn = false;
                    check_conn = checkInternetConnection();//check if you are on internet

                    if (check_conn){
                        //we have connection
                        // find the all the possible IPs
                        Intent intent = new Intent(MainActivity.this, rangeIP_test.class);
                        startActivity(intent);
                    }
                    else {
                        // do something annoying
                        Toast.makeText(MainActivity.this,
                                "We need Internet Connection!", Toast.LENGTH_LONG).show();
                    }
                }
            });

rangeIP_test Активность, которая вычисляет IP

WifiManager my_wifi = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
String subnet = getSubnetAddress(my_wifi.getDhcpInfo().gateway);
IPs = findIP(subnet);

public List<String> findIP(String subnet){
        List<String> all_IPs;// All IPs on network
        all_IPs = new ArrayList<>();

        for (int i=2; i<255; i++){
            String host = subnet + "." + i;

            all_IPs.add(host);
        }
        return all_IPs;
    }

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

Использование startActivityForResult и onActivityResult может работать.

вызывать rangeIP_test Activity с помощью startActivityForResult () и возвращать ваш список с помощью setResult ().Не забудьте завершить (), когда работа выполнена.

0 голосов
/ 12 октября 2018

Запустите действие, rangeIP_test, для результата (т. Е. Списка строк хостов) следующим образом:

 Intent intent = new Intent(MainActivity.this, rangeIP_test.class);
 startActivityForResult(intent,RC_LIST_STRING);

Определите RC_LIST_STRING как поле, подобное этому в MainActivity.java:

 private static final int RC_LIST_STRING = 10001;

Переопределить onActivityResult () в MainActivity.java следующим образом:

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // Check which request we're responding to
        if (requestCode == RC_LIST_STRING) {
            // Make sure the request was successful
            if (resultCode == RESULT_OK) {
               // get the list of strings here
               ArrayList<String> myHosts = (ArrayList<String>) data.getSerializableExtra("myHosts"); // key must be matching 
               // do operations on the list
            }
        }
    }

В rangeIP_test.java после успешного получения всех хостов и добавления их в список,Вы можете передать список обратно любой активности (здесь, MainActivity), начавшей текущую деятельность (здесь, rangeIP_test) следующим образом:

Intent intent = new Intent();
intent.putExtra("myHosts", (Serializable) IPs);
setResult(RESULT_OK, intent);
finish();

Теперь, когда вы завершили rangeIP_test действиевы вернулись к MainActivity и, поскольку вы переопределили onActivityResult(), вы получите список хостов там.

Имейте в виду, что в этом примере вы конвертируетесписок хостов в сериализованный тип и передача его в предыдущее действие.Поскольку String и ArrayList уже реализуют интерфейс Serializable , вы не получите никакой ошибки unable to marshal value .Однако, передавая объекты модели вокруг действий, вы должны сначала заставить класс модели реализовать интерфейс Serializable, а затем продолжить работу, как описано выше.

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

0 голосов
/ 12 октября 2018

Вы можете напрямую передать список в намерения дополнительно

что-то вроде этого

Intent intent = getIntent();  
intent.putStringArrayListExtra("test", (ArrayList<String>) all_IPs);

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

ArrayList<String> test = getIntent().getStringArrayListExtra("test");
...