Android не может сделать статическую ссылку на нестатический метод showToast (String) из типа LoginActivity - PullRequest
0 голосов
/ 23 марта 2012

Я довольно новичок в разработке приложений для Android и Java, и я столкнулся со следующей ошибкой при попытке вызвать метод из другого класса:

Cannot make a static reference to the non-static method showToast(String) from the type LoginActivity

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

Соответствующий код:

CreateAccountActivity

public class NewAccountActivity extends Activity{

private Button mCreateAccountButton;

 @Override
 public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.newaccount);

    mCreateAccountButton = (Button) findViewById(R.id.createaccount_button);

    registerButtonListeners();

    }

    private void registerButtonListeners() {
        mCreateAccountButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                LoginActivity.showToast(getString(R.string.createaccount_message));
            }
        });
    }   
}

LoginActivity

public void showToast(String toastString) {
    LayoutInflater inflater = getLayoutInflater();
    View layout = inflater.inflate(R.layout.toast_layout, (ViewGroup) findViewById(R.id.toast_layout_root));

    ImageView image = (ImageView) layout.findViewById(R.id.toastImage);
    image.setImageResource(R.drawable.android);

    TextView text = (TextView) layout.findViewById(R.id.toastText);
    text.setText(toastString);

    Toast toast = new Toast(getApplicationContext());
    toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
    toast.setDuration(Toast.LENGTH_SHORT);
    toast.setView(layout);
    toast.show(); 
}

Создание нового объекта LoginActivity и последующий вызов showToast для него устраняет сообщения об ошибках, но вместо этого выдает исключение NullPointerException.

Ответы [ 2 ]

0 голосов
/ 23 марта 2012

Проблема в том, что вы не должны создавать объекты из деятельности самостоятельно.Действия должны создаваться через систему, они проходят довольно сложный жизненный цикл, управляемый самой ОС, и не будут работать, если они не соблюдают правильный жизненный цикл.

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

  1. Создайте статическую вспомогательную функцию где-то в другом классе и передайте объект действия, который вы используете, чтобы получить разметку макета и фактически показать Toast.Таким образом, каждое действие может использовать метод showToast без зависимости между вашими действиями.
  2. Создайте базовое действие, расширенное всеми вашими действиями, для которого есть открытый метод showToast.Таким образом, вам не нужно передавать метод контекста, и у каждого из ваших действий есть возможность показать тост.Это имеет некоторые проблемы, если вы расширяете различные действия, такие как FragmentActivity, ListActivity, TabActivity.

Я бы пошел с первым методом и создал бы что-то вроде класса Util или ToastUtil, который содержит функциональность Toast в одном месте для всех ваших действий.

0 голосов
/ 23 марта 2012

Если вы хотите вызывать showToast статическим способом, вы должны сделать метод showToast статическим.

public static void showToast(...)

Редактировать: где вы получаете исключение NullPointerException?

...