Topic: Переключение между экранами приложения
Обсуждение статьи Переключение между экранами приложеия
Все вопросы проплачены кошками - всемирно известными производителями котят
You are not logged in. Please login or register.
Для регистрации на форуме следует написать мне письмо. В ответе я напишу правильный ответ для прохождения регистрации.
Форум Александра Климова → Android → Переключение между экранами приложения
Обсуждение статьи Переключение между экранами приложеия
Александр, добрый день.
В первую очередь хочу поблагодарить за ресурс, очень полезный и доступный для новичков.
В этом уроке в проекте Sherlock при кодировании ожидания ответа методом onActivityResult() в первом экране у меня выдавалась ошибка "Cannot resolve symbol `infoTextView`", которая устранилась при инициализации текста следующим способом:
TextView infoTextView = (TextView) findViewById(R.id.textViewInfo);
Верно ли это? Или возможно какое-то другое решение?
В последнем разделе идет речь о фильтрах... правильно понимаю, что приведенный пример должен произвести переход на активность из другого проекта? Если да, то при его использовании у меня это не сработало, и переход произошел на соответствующую активность текущего проекта, в чем может быть причина?
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.dsibi_000.lesson53" >
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".MainActivity2Activity"
android:label="@string/title_activity_main_activity2" >
<intent-filter>
<action android:name="com.example.dsibi_000.lesson5_sherlock.MainActivity2Activity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".MainActivity3Activity"
android:label="@string/title_activity_main_activity3" >
<intent-filter>
<action android:name="com.example.dsibi_000.lesson5_sherlock.MainActivity2Activity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
</manifest>
По поводу TextView - всё правильно. Видимо я упустил этот момент, но если вы сообразили, то молодец.
Если он используется еще где-то, то объявить его в классе и инициализировать в onCreate().
Поправлю в статье.
Насчет перехода - приведенного кода недостаточно, чтобы понять причину. Возможно, что-то упустили
Добрый день.
Спасибо за ресурс!
Не получилось вызвать активность ACTION_AIRPLANE_MODE_SETTINGS.
При вызове получаю следующую ошибку "Unfortunately, бла бла бла, has stopped".
Вызвваю следующим образом:
public void onClSet(View view) {
startActivity(new Intent("android.provider.Settings.ACTION_AIRPLANE_MODE_SETTINGS"));
}
При этом в трейсе вижу следующее инфо:
Caused by: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.provider.Settings.ACTION_AIRPLANE_MODE_SETTINGS }
Похоже нужно, что-то дополнительно импортировать...
У вас лишние кавычки. Это константа, а не строка
startActivity(
new Intent(android.provider.Settings.ACTION_AIRPLANE_MODE_SETTINGS));
Если в виде строки, то
startActivity(new Intent("android.settings.AIRPLANE_MODE_SETTINGS"));
У вас лишние кавычки. Это константа, а не строка
startActivity(
new Intent(android.provider.Settings.ACTION_AIRPLANE_MODE_SETTINGS));Если в виде строки, то
startActivity(new Intent("android.settings.AIRPLANE_MODE_SETTINGS"));
О, чёрт, вот я простофиля...
Спасибо большое!
В ScrollView не отображается верхняя панель с "О программе".
Где она задается?
Добрый день.
Необходимо создать дополнительные активности которые полностью копируют разметку
и наполнение главной активности.
Нужно-ли прописывать эти активности в манифесте?
Спасибо.
Любую активность нужно прописывать в манифесте. Это обязательное условие системы.
В ScrollView не отображается верхняя панель с "О программе".
Где она задается?
Например, в теме. Может у вас тема без заголовка ...NoTitleBar
Добрый день, Александр.
Есть ли возможность сделать, например, в MainActivity несколько кнопок, каждая из которых открывает свою уникальную Activity? Как в таком случае строится код обработчика нажатия? Может, я просто невнимателен и Вы где-то уже об этом упоминали?
Естественно, упоминал. Либо создаете для каждой кнопки обработчик, либо один обработчик, который определяет нажатую кнопку по идентификатору. Перечитайте статью про кнопку http://developer.alexanderklimov.ru/and … button.php
Здравствуйте.
Спасибо за статьи, сайт просто отличный! И самое невероятное, что в нём постоянно обновляется информация, это очень приятно.
Будучи человеком придирчивым, хочу сделать небольшой bug report: в примере с приёмом данных от другой активности есть код:
// Значения по умолчанию
String user = "ЖЫвотное";
String gift = "дырку от бублика";
user = getIntent().getExtras().getString("username");
gift = getIntent().getExtras().getString("gift");
TextView infoTextView = (TextView)findViewById(R.id.textViewInfo);
infoTextView.setText(user + " , вам передали " + gift);
Так вот, значения по умолчанию не будут использоваться, и если в extras ничего не передали, то приложение выдаст исключение. Потому что getIntent().getExtras() вернёт null.
Нужно сделать проверку:
String user = "";
String gift = "";
if (getIntent() == null || getIntent().getExtras() == null) {
// Значения по умолчанию
user = "ЖЫвотное";
gift = "дырку от бублика";
} else {
user = getIntent().getExtras().getString("username");
gift = getIntent().getExtras().getString("gift");
}
TextView infoTextView = (TextView) findViewById(R.id.textViewInfo);
infoTextView.setText(user + " , вам передали " + gift);
В учебных примерах часто опускаются проверки, чтобы уменьшить количество кода, которое будет мешать понимать логику. Хотя по-хорошему, наверное, стоит учесть ваше замечание. Возьму на карандаш. Спасибо.
Так вот, значения по умолчанию не будут использоваться, и если в extras ничего не передали, то приложение выдаст исключение. Потому что getIntent().getExtras() вернёт null.
Ошибся, прошу прощения. Первая Activity передаст пустые строки, и getIntent().getExtras() не будет равным null, исключение не возникнет. Но значения по умолчанию всё равно не используются.
Просто сам немного по-другому написал программу, в которой возможны непереданные данные, и у меня она, естественно, вылетала (что всегда "радует" неподготовленного пользователя/программиста). Думал, что и здесь должно быть так же. Семь раз отмерь, потом пиши bug report...
На самом деле вы рассуждали в правильном направлении. В моем конкретном примере исключение не возникает, но возможна ситуация, когда такая беспечность приведет к краху. Я добавил ремарку в пример на сайте.
vasilek.aleksashin wrote:В ScrollView не отображается верхняя панель с "О программе".
Где она задается?
Например, в теме. Может у вас тема без заголовка ...NoTitleBar
Тоже с этой проблемой некоторое время промучился, потом обнаружил, что если AboutActivity наследуется от ActionBarActivity, заголовок есть без всяких дополнительных настроек, а если от Activity, нет его.
Вполне возможно, что в новых версиях у Activity теперь нет заголовка по умолчанию. Тогда его надо включить, выбрав нужную тему или программно. Раньше как-раз было наоборот, у любой активности был заголовок.
Здравствуйте , где мы передаем requestCode первому параметру . Или это из-за того что setResult(RESULT_OK, answerIntent); здесь мы первую переменную пустым оставили ? И еще Intent answerIntent = new Intent(); здесь при созадний обьекта мы не указываем параметров . Как activity поймет куда передать данные ? И про метод finish() непонятно . Не ясно написали для чего используется .
Про finish() там написано - явно закрывает активность.
Активности не надо понимать, куда передавать. Она просто передает, а кому надо, тот и примет.
Такой вопросик:
Почему в коде:
switch (v.getId()) {
case R.id.radioDog:
answerIntent.putExtra(THIEF, "Сраный пёсик");
break;
case R.id.radioCrow:
answerIntent.putExtra(THIEF, "Ворона");
break;
case R.id.radioCat:
answerIntent.putExtra(THIEF, "Лошадь Пржевальского");
break;
мы переменной THIEF присваиваем значения в виде текста, а не ссылки на переменную типа R.string.dog ? И почему программа не работает если указать ссылку? Как сделать правильно через ссылку что бы придерживаться красоты кода?
answerIntent.putExtra(THIEF, R.string.dog);
Но в этом случае будет возвращаться не строка, а число int.
Соответственно нужно переписывать код в первой активности
if (requestCode == CHOOSE_THIEF) {
if (resultCode == RESULT_OK) {
int thiefname = data.getIntExtra(SecondActivity.THIEF, 0);
Toast.makeText(getApplicationContext(), thiefname, Toast.LENGTH_SHORT).show();
}else {
//
}
}
чет у меня какая то беда...
в первой активности когда уже получаем результат:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
TextView infoTextView = (TextView)findViewById(R.id.textViewInfo);
if (requestCode == CHOOSE_THIEF){
if(resultCode == RESULT_OK){
String thiefname = data.getStringExtra(ChoseActivity.THIEF);
infoTextView.setText(thiefname);
}else {
infoTextView.setText("");
}
}
}
CHOOSE_THIEF у меня красным светится и все тут... из за чего? во второй эта переменная фиолетовая..
Если красным, значит переменной не существует. Вы её объявили?
она обьявлена во второй активности. в первой так же как и во второй?
Форум Александра Климова → Android → Переключение между экранами приложения
Powered by PunBB, supported by Informer Technologies, Inc.