Проблемы при переводе статического метода в kotlin из Java - PullRequest
0 голосов
/ 12 мая 2018

Я пытаюсь понять и перевести код Java на kotlin. Код доступен здесь .

В основном есть два файла классов

  1. DeviceListActivity: Позволяет пользователю выбрать item из ListView
  2. SerialConsoleActivity: Выполняет операцию чтения / записи для выбранного item

Соответствующий раздел кода из DeviceListActivity следующий:

private void showConsoleActivity(UsbSerialPort port) {
        SerialConsoleActivity.show(this, port);
    }

Соответствующий фрагмент кода из SerialConsoleActivity выглядит следующим образом:

public class SerialConsoleActivity extends Activity {

    private final String TAG = SerialConsoleActivity.class.getSimpleName();

    /**
     * Driver instance, passed in statically via
     * {@link #show(Context, UsbSerialPort)}.
     *
     * <p/>
     * This is a devious hack; it'd be cleaner to re-create the driver using
     * arguments passed in with the {@link #startActivity(Intent)} intent. We
     * can get away with it because both activities will run in the same
     * process, and this is a simple demo.
     */

    private static UsbSerialPort sPort = null;

    ...
    //more code
    ...


   static void show(Context context, UsbSerialPort port) {
        sPort = port;
        final Intent intent = new Intent(context, SerialConsoleActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY);
        context.startActivity(intent);
    }

}

Часть, которую я не могу понять, это как статический метод show из SerialConsoleActivity может сохранить передаваемый объект port? Нет экземпляра родительского объекта задействованный класс (что также является целью статического метода).

Для достижения эффекта, подобного описанному выше, я написал следующий код, но он не работает:

class MainActivity : AppCompatActivity() {

    var sPort :UsbSerialPort?=null
    private val GET_AVAILABLE_USB_DEVICE = 1

    companion object {
        const val PORT = "port"
        fun show(context: Context, port: UsbSerialPort) {
            sPort = port
        }
    }

sПорт недоступен изнутри шоу.

Если я переместу функцию show за пределы объекта-компаньона,

Тогда я не могу сделать следующее

MainActivity.show(this, port_obj)

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

Другой вариант - реализовать сериализуемый объект (поскольку порт еще не сериализуем) и передать его через намерение, но я еще не разбираюсь в сериализации. Таким образом, я ищу такой же обходной путь, как и в оригинальной работе «kotlin'y way». Пожалуйста, помогите.

1 Ответ

0 голосов
/ 12 мая 2018

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

companion object {
    const val PORT = "port"
    UsbSerialPort sPort = null;
    fun show(context: Context, port: UsbSerialPort) {
        sPort = port
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...