Topic: Переключение между экранами приложения

Обсуждение статьи Переключение между экранами приложеия

Re: Переключение между экранами приложения

Александр, добрый день.

В первую очередь хочу поблагодарить за ресурс, очень полезный и доступный для новичков.

В этом уроке в проекте 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>

Re: Переключение между экранами приложения

По поводу TextView - всё правильно. Видимо я упустил этот момент, но если вы сообразили, то молодец.
Если он используется еще где-то, то объявить его в классе и инициализировать в onCreate().
Поправлю в статье.
Насчет перехода - приведенного кода недостаточно, чтобы понять причину. Возможно, что-то упустили

Re: Переключение между экранами приложения

Добрый день.

Спасибо за ресурс!

Не получилось вызвать активность 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 }
Похоже нужно, что-то дополнительно импортировать...

Re: Переключение между экранами приложения

У вас лишние кавычки. Это константа, а не строка
startActivity(
                new Intent(android.provider.Settings.ACTION_AIRPLANE_MODE_SETTINGS));

Если в виде строки, то
startActivity(new Intent("android.settings.AIRPLANE_MODE_SETTINGS"));

6 (edited by evgeniy 2015-07-25 16:33:07)

Re: Переключение между экранами приложения

alexander.klimoff wrote:

У вас лишние кавычки. Это константа, а не строка
startActivity(
                new Intent(android.provider.Settings.ACTION_AIRPLANE_MODE_SETTINGS));

Если в виде строки, то
startActivity(new Intent("android.settings.AIRPLANE_MODE_SETTINGS"));

О, чёрт, вот я простофиля...
Спасибо большое!

Re: Переключение между экранами приложения

В ScrollView не отображается верхняя панель с "О программе".

Где она задается?

Re: Переключение между экранами приложения

Добрый день.
Необходимо создать дополнительные активности которые полностью копируют разметку
и наполнение главной активности.
Нужно-ли прописывать эти активности в манифесте?
Спасибо.

Re: Переключение между экранами приложения

Любую активность нужно прописывать в манифесте. Это обязательное условие системы.

Re: Переключение между экранами приложения

vasilek.aleksashin wrote:

В ScrollView не отображается верхняя панель с "О программе".

Где она задается?

Например, в теме. Может у вас тема без заголовка ...NoTitleBar

Re: Переключение между экранами приложения

Добрый день, Александр.
Есть ли возможность сделать, например, в MainActivity несколько кнопок, каждая из которых открывает свою уникальную Activity? Как в таком случае строится код обработчика нажатия? Может, я просто невнимателен и Вы где-то уже об этом упоминали?

Re: Переключение между экранами приложения

Естественно, упоминал. Либо создаете для каждой кнопки обработчик, либо один обработчик, который определяет нажатую кнопку по идентификатору. Перечитайте статью про кнопку http://developer.alexanderklimov.ru/and … button.php

Re: Переключение между экранами приложения

Здравствуйте.
Спасибо за статьи, сайт просто отличный! И самое невероятное, что в нём постоянно обновляется информация, это очень приятно.

Будучи человеком придирчивым, хочу сделать небольшой 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);

Re: Переключение между экранами приложения

В учебных примерах часто опускаются проверки, чтобы уменьшить количество кода, которое будет мешать понимать логику. Хотя по-хорошему, наверное, стоит учесть ваше замечание. Возьму на карандаш. Спасибо.

Re: Переключение между экранами приложения

VenyaKorablev wrote:

Так вот, значения по умолчанию не будут использоваться, и если в extras ничего не передали, то приложение выдаст исключение. Потому что getIntent().getExtras() вернёт null.

Ошибся, прошу прощения. Первая Activity передаст пустые строки, и getIntent().getExtras() не будет равным null, исключение не возникнет. Но значения по умолчанию всё равно не используются.
Просто сам немного по-другому написал программу, в которой возможны непереданные данные, и у меня она, естественно, вылетала (что всегда "радует" неподготовленного пользователя/программиста). Думал, что и здесь должно быть так же. Семь раз отмерь, потом пиши bug report...

Re: Переключение между экранами приложения

На самом деле вы рассуждали в правильном направлении. В моем конкретном примере исключение не возникает, но возможна ситуация, когда такая беспечность приведет к краху. Я добавил ремарку в пример на сайте.

Re: Переключение между экранами приложения

alexander.klimoff wrote:
vasilek.aleksashin wrote:

В ScrollView не отображается верхняя панель с "О программе".

Где она задается?

Например, в теме. Может у вас тема без заголовка ...NoTitleBar

Тоже с этой проблемой некоторое время промучился, потом обнаружил, что если AboutActivity наследуется от ActionBarActivity, заголовок есть без всяких дополнительных настроек, а если от Activity, нет его.

Re: Переключение между экранами приложения

Вполне возможно, что в новых версиях у Activity теперь нет заголовка по умолчанию. Тогда его надо включить, выбрав нужную тему или программно. Раньше как-раз было наоборот, у любой активности был заголовок.

Re: Переключение между экранами приложения

Здравствуйте , где мы передаем requestCode первому параметру  . Или это из-за того что setResult(RESULT_OK, answerIntent);  здесь мы первую переменную пустым оставили ?   И еще Intent answerIntent = new Intent(); здесь при созадний обьекта мы не указываем параметров . Как activity поймет куда передать данные ?  И про метод finish() непонятно . Не ясно написали для чего используется .

Re: Переключение между экранами приложения

Про finish() там написано - явно закрывает активность.
Активности не надо понимать, куда передавать. Она просто передает, а кому надо, тот и примет.

Re: Переключение между экранами приложения

Такой вопросик:
Почему в коде:
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 ? И почему программа не работает если указать ссылку? Как сделать правильно через ссылку что бы придерживаться красоты кода?

Re: Переключение между экранами приложения

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 {
                //
            }
        }

Re: Переключение между экранами приложения

чет у меня какая то  беда...
в первой активности когда уже получаем результат:

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 у меня красным светится и все тут... из за чего? во второй эта переменная фиолетовая..

Re: Переключение между экранами приложения

Если красным, значит переменной не существует. Вы её объявили?

Re: Переключение между экранами приложения

она обьявлена во второй активности. в первой так же как и во второй?