Android: ООП | использование функций в других файлах

#java #android #oop

#java #Android #ооп

Вопрос:

Я довольно новичок в Android, но у меня есть некоторый опыт (и немного подзабыл) работы с Java и ООП.

В основном, что делает мое приложение, так это то, что при нажатии кнопки будут мигать светодиоды или «изображения».

Я пытаюсь разделить свой проект на несколько файлов, где я могу просто импортировать файл java для использования функций класса, но я не уверен, как это сделать…

У меня есть два файла. 1) HelloFormStuff.java (это похоже на основной), и 2) led_functions.java

В HelloFormStuff я поместил:

 import com.example.helloformstuff.led_functions
// com.example.helloformstuff is the package
  

Пример кода.. HelloFormStuff.java

     public class HelloFormStuff extends Activity {

/* Called when the activity is first created. */
@Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    final Button btn1 = (Button) findViewById(R.id.btn1);
    btn1.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            // Perform action on clicks
            currentMode.setText("Button 1 Pressed");
            led_circleBusy();
           }
    });
}
  

}

И в led_functions.java …

 public class led_functions extends Activity{

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    final ImageView LED_1;
    LED_1 = (ImageView)findViewById(R.id.LED_1);

   @Override 
    public void led_circleBusy()
    {
        LED_1.setVisibility(View.INVISIBLE);

    }
  

}

Я получаю сообщение об ошибке: метод led_circleBusy() не определен для типа new View.OnClickListener(){}

Итак, я спрашиваю, как реализовать мои другие функции из других файлов.

Спасибо.

-Пол

PS: Я просматривал пример кода, и если вам интересно, почему я вставил что-то вроде «@Override» там, где это не нужно, просто игнорируйте это.. Я пробовал случайные вещи: l

Комментарии:

1. Почему led_functions расширяется Activity ? Activity — это класс пользовательского интерфейса. Кроме того, вы пытаетесь вызвать метод led_circleBusy() для класса, экземпляр которого не был создан, и, поскольку led_functions это Activity, и его невозможно создать из другого Activity, он все равно не будет работать. Пожалуйста, смотрите … developer.android.com/guide/topics/fundamentals.html

2. Спасибо, это имеет смысл. Я просто копировал свой код из HelloFormStuff, не зная, что Activity создает другой класс пользовательского интерфейса.

3. Приношу извинения за неправильное использование вашего имени в моем первом комментарии. Лучший способ подойти к этому — создать класс ‘helper’, а затем создать его экземпляр в рамках вашей деятельности — тогда вы сможете вызывать для него методы по мере необходимости. Вы можете использовать практически любой «универсальный» класс Java (или POJO) при программировании на Android. Просто помните, что определенные классы, такие как Activity , играют особую роль в приложении для Android.

4. @MisterSquonk: Спасибо. Создание вспомогательного класса — это именно то, что я пытаюсь сделать .. просто выясняю, как это сделать.

Ответ №1:

Что ж, похоже, вам придется вернуться к изучению:

  1. Java / ООП
  2. Жизненные циклы приложений Android

    1. Java / ООП

В Java вы не можете определить метод внутри другого метода так, как вы сделали с led_circleBusy() внутри onCreate(). Ваш класс led_functions не может скомпилироваться как есть.

Затем вам пришлось бы либо объявить свой led_circleBusy(), чтобы вызвать его из любого места с помощью led_functions.led_circleBusy(), либо создать новый экземпляр led_functions (new led_functions()) перед вызовом led_circleBusy() на нем.

  1. Жизненные циклы приложений Android

Действия в приложениях Android можно рассматривать как «экраны». 2 Действия могут обмениваться данными только через намерения. Действие над представлением в одном действии может изменить представление во втором действии, только передав намерение из действия A в действие B.

Если ваши компоненты находятся на одном экране, то у вас должно быть не 2 подкласса Activity, а только один и служебный класс, которому вы передаете параметры из своей Activity.

Вы должны прочитать очень внимательно http://developer.android.com/guide/topics/fundamentals/activities.html#Lifecycle

А затем прочитайте это еще раз.

Второе, что вам следует внимательно прочитать в руководстве по разработке Android, касается намерений: http://developer.android.com/guide/topics/intents/intents-filters.html

Эти концепции новы для любого разработчика, независимо от того, имеет он опыт работы с Java или нет. Таким образом, вам придется потратить время, необходимое для их детального понимания, чтобы иметь возможность создать самое простое приложение для Android.

Ответ №2:

Вы можете сделать следующее из своего HelloFormStuff класса.

 led_functions led = new led_functions();
led.led_circleBusy();
  

Затем избавьтесь от @Override описанного выше led_circleBusy() метода. На самом деле вам не следует вызывать методы других Activity подобным образом. led_functions Действительно ли это класс Activity / UI? Если нет, удалите extends Activity , добавьте LED_1 в HelloFormStuff , а затем передайте его в качестве параметра в led.led_circleBusy(ImageView led1) .

Комментарии:

1. Спасибо за ответ. Я удалил «extends Activity», как вы сказали, но теперь строка «LED_1 = (ImageView)findViewById(R.id.LED_1); » не работает, потому что она предназначена для класса пользовательского интерфейса Activity..

2. Правильно, вот почему я упомянул, что вам следует перенести обработку LED_1 в ваше основное действие, а затем передать его в качестве параметра led_circleBusy (..).

Ответ №3:

Пока все классы (специфичные для Android или иные) занимают один и тот же пакет / пространство имен, например, com.mycompany.mypackage, импорт не требуется…

Для помощника…

 package com.mycompany.mypackage

public class MyHelper {

    public void doSomething() {
        ...
    }

}
  

Для выполнения действия…

 package com.mycompany.mypackage

public class MyActivity extends Activity {

    private MyHelper helper = new MyHelper();

    @Override
    protected void onCreate(...) {
        ...

        helper.doSomething();

}
  

Комментарии:

1. Хорошо, это то, что у меня есть до сих пор в led_functions. открытый класс led_functions{ окончательный просмотр изображения LED_1; LED_1 = (просмотр изображения)findViewById(R.id.LED_1); Но теперь у него проблема с findViewById (я думаю, поскольку это не относится к Activity UI), и ошибка заключается в следующем: тип возвращаемого значения для метода отсутствует

2. На самом деле, я понял. Спасибо за информацию о вспомогательном классе!

Ответ №4:

Класс HelloFormStuff не имеет реализации led_circleBusy(), поэтому этот метод не мог быть вызван

Комментарии:

1. Вы создаете открытый метод с именем led_circleBusy()… Это также странное соглашение об именовании для Java-приложения.

2. Могу я спросить, как это реализовать?

3. @Ed S. Я подумал то же самое о соглашении об именовании, но был слишком ленив, чтобы выразить это в моем ответе 🙂

4. @Ed S. Я переношу это из существующего проекта, встроенного в C, и в настоящее время использую те же имена для имен файлов / функций, просто чтобы сохранить его читаемым.

5. Соглашения об именовании — наименее важные ошибки в этом коде … 😉

Ответ №5:

У вас есть два способа.

  1. Объявите led_circleBusy() как статический, затем вы можете вызвать его как в led_functions.led_circleBusy()

  2. Сохраняйте его нестатичным и вызывайте его на экземпляре led_functions , как в

    led_functions lf = new led_functions();
    lf.led_circleBusy();

Это строго на языке Java. Если на самом деле это две разные Activity системы (разные «окна»), которые ничего не разделяют, но одна вызывает другую, вам следует взглянуть на Intent системы.