Как сказал @Veger, вы можете сделать его final
, чтобы переменная могла использоваться во внутреннем классе.
final ViewPager pager = (ViewPager) findViewById(R.id.fieldspager);
Я назвал его pager
, а не mPager
, потому что вы используют его как локальную переменную в методе onCreate
. Префикс m
зарезервирован для переменных класса (т.е. переменных, объявленных в начале класса и доступных для всех методов класса).
Если вам действительно нужна переменная-член класса, он не работает, чтобы сделать его окончательным, потому что вы не можете использовать findViewById
, чтобы установить его значение до onCreate
. Решение состоит в том, чтобы не использовать анонимный внутренний класс. Таким образом, переменная mPager
не обязательно должна быть объявлена окончательной и может использоваться во всем классе.
public class MainActivity extends AppCompatActivity {
private ViewPager mPager;
private Button mButton;
@Override
public void onCreate(Bundle savedInstanceState) {
// ...
mPager = (ViewPager) findViewById(R.id.fieldspager);
// ...
mButton.setOnClickListener(myButtonClickHandler);
}
View.OnClickListener myButtonClickHandler = new View.OnClickListener() {
@Override
public void onClick(View view) {
mPager.setCurrentItem(2, true);
}
};
}
Этот раздел веб-сайта Серда подробно описывает границы Deserialize
.
Существует два основных способа записи границ атрибутов Deserialize
, независимо от того, блок impl или функция или где-либо еще.
<'de, T> where T: Deserialize<'de>
Это означает, что «T можно десериализовать с некоторого времени жизни». Вызывающий получает решение о том, что такое жизнь. Обычно это используется, когда вызывающий объект также предоставляет данные, которые десериализуются, например, в функции, подобной serde_json::from_str
. В этом случае входные данные также должны иметь время жизни 'de
, например, это может быть &'de str
. <T> where T: DeserializeOwned
Это означает, что «T можно десериализовать из любого времени жизни». Вызванный получает решение, какое время жизни. Обычно это происходит из-за того, что данные, которые десериализуются, будут выброшены до того, как функция вернется, поэтому T не может быть разрешено заимствовать у нее. Например, функция, которая принимает данные с кодировкой base64 в качестве входных данных, декодирует ее из base64, десериализует значение типа T, а затем отбрасывает результат декодирования base64. Другим распространенным применением этой функции является функция десериализации из потока ввода-вывода, например serde_json::from_reader
. Чтобы сказать это более технически, признак DeserializeOwned
эквивалентен оценке более высокого ранга for<'de> Deserialize<'de>
. Единственная разница в DeserializeOwned
более понятна для чтения. Это означает, что T владеет всеми данными, которые десериализуются. Я нашел ответ из вопроса Serde 891 : я должен использовать DeserializeOwned
вместо Deserialize
.