использование findviewbyid в классе, который не расширяет активность в Android - PullRequest
38 голосов
/ 30 ноября 2011

У меня есть класс, который в настоящее время расширяет Activity, и у меня есть методы, такие как findViewById, ArrayAdapter и т. Д. Я хочу превратить его в независимый класс, но все вышеперечисленные методы становятся неопределенными. В чем проблема? Разве импорта классов не должно быть достаточно? Например, я импортирую android.view.View для findViewById, но это все равно не имеет значения. Пожалуйста, сообщите.

Ответы [ 4 ]

69 голосов
/ 30 ноября 2011

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

В вашем Activity Создайте свой класс следующим образом:

MyClass instance = new MyClass(this);

А в вашем втором классе конструктор будет выглядеть так:

public class MyClass {

public Activity activity; 
//.... other attributes 

public MyClass( Activity _activity){

   this.activity = _activity;
//other initializations...

}
}

и затем, когда вы захотите использовать метод findViewById(), вы можете сделать так:

EditText txt = (EditText)this.activity.findViewById(R.id.txt);
8 голосов
/ 30 ноября 2011

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

например.

class A extends Activity {
    Context ctx;

    void onCreate(Bundle b)
        ctx = this;
        B bob = new B(ctx);
    }
}

Вот класс В.

class B {

    B (Activity a) {
        a.anyFunctionOfActivity();
    }
}
6 голосов
/ 30 ноября 2011

findViewById является нестатическим открытым методом класса Activity, поэтому он доступен только для Activity объекта . Поэтому импорт android.view.View и android.app.Activity не сделает его доступным. Чтобы сделать его доступным, вы можете передать объект Actvity - обычно this балл в вашей активности. Однако обратите внимание, что вы всегда должны обновлять свой вид в потоке пользовательского интерфейса.

0 голосов
/ 25 марта 2017

Пожалуйста, попробуйте следующее:

public static View getLayoutByRes(@LayoutRes int layoutRes,@Nullable ViewGroup viewGroup)
{
    final LayoutInflater factory = getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    return factory.inflate(layoutRes, viewGroup);
}

TextView tv = (TextView) getLayoutByRes(R.layout.xxx ,Null).findViewById(R.id.editd);
...