findViewById внутри статического метода
у меня есть этот статический метод:
public static void displayLevelUp(int level, Context context) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.custom_level_coast,
(ViewGroup) findViewById(R.id.toast_layout_root)); // this row
TextView text = (TextView) layout.findViewById(R.id.toastText);
text.setText("This is a custom toast");
Toast toast = new Toast(context);
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(layout);
toast.show();
Toast.makeText(context, String.valueOf(level), Toast.LENGTH_SHORT)
.show();
}
однако я не могу понять, как получить первыйfindViewById
чтобы играть хорошо с этим, как он говорит, это нестатический метод. Я понимаю, почему он так говорит, но должен быть обходной путь? Я прошел context
в этот метод, но не мог работать их вместе.
3 ответов
одна вещь, которую вы можете сделать, это сделать представление переменной класса и использовать ее. Я не рекомендую делать это, но это сработает, если вам нужно что-то быстрое и грязное.
передав в качестве параметра будет предпочтительным способом
это немного странно. Но вы можете передать корневое представление как параметр.
//some method...
ViewGroup root = (ViewGroup) findViewById(R.id.toast_layout_root);
displayLevelUp(level, context, root);
//some method end...
public void displayLevelUp(int level, Context context, ViewGroup root) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.custom_level_coast,
root);
TextView text = (TextView) layout.findViewById(R.id.toastText);
text.setText("This is a custom toast");
Toast toast = new Toast(context);
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(layout);
toast.show();
Toast.makeText(context, String.valueOf(level), Toast.LENGTH_SHORT)
.show();
}
Если вы хотите придерживаться статического метода, используйте Activity вместо контекста в качестве параметра и выполните действие.findViewById нравится так:
public static void displayLevelUp(int level, Activity activity) {
LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.toastText, (ViewGroup) activity.findViewById(R.id.abs__action_bar_container)); // this row
другой способ сделать это-передать родительскую ViewGroup в качестве параметра вместо контекста или действия:
public static void displayLevelUp(int level, ViewGroup rootLayout) {
View layout = rootLayout.inflate(rootLayout.getContext(), R.layout.custom_level_coast, rootLayout.findViewById(R.id.toast_layout_root)); // this row