@Abejon

Android: почему intent приходит с пустым Extras?

Есть две activity в приложении. Login:
package com.myapp.myappardandroid;
 
import android.arch.persistence.room.Room;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
 
import java.util.ArrayList;
import java.util.List;
 
import static com.mayapp.myappandroid.Constants.SETTINGS;
 
public class LoginActivity extends AppCompatActivity {
 
    private SettingsDatabase db;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
 
        Intent intent = getIntent();
 
        ImageButton settingsBtn = findViewById(R.id.settingsBtn);
        settingsBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                updateSettings(view);
            }
        });
 
        db = Room.databaseBuilder(getApplicationContext(), SettingsDatabase.class, "settingsDb")
                .allowMainThreadQueries()
                .build();
    }
 
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        super.onActivityResult(requestCode, resultCode, data);
 
        if (resultCode == RESULT_OK) {
            db.getSettingsDao().insert(new Settings("apiEndPoint", data.getStringExtra("apiEndPoint")));
            db.getSettingsDao().insert(new Settings("apiKey", data.getStringExtra("apiKey")));
        }
    }
 
    private void updateSettings(View view) {
        Intent intent = new Intent(LoginActivity.this, SettingsActivity.class);
        List<Settings> settingsList = db.getSettingsDao().getAllSettings();
        for(int i = 0; i < settingsList.size(); i++){
            Settings settings = settingsList.get(i);
            intent.putExtra(settings.getParamName(), settings.getParamValue() == null ? "" : settings.getParamValue());
        }
        startActivityForResult(intent, SETTINGS);
    }
}

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.myapp.myappandroid.LoginActivity">
 
    <!-- Login progress -->
    <ProgressBar
        android:id="@+id/login_progress"
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:visibility="gone" />
 
    <ScrollView
        android:id="@+id/login_form"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
 
        <LinearLayout
            android:id="@+id/email_login_form"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
 
            <android.support.v7.widget.AppCompatImageButton
                android:id="@+id/settingsBtn"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="right"
                android:src="@drawable/settings_icon"
                android:background="@android:color/transparent" />
 
            <android.support.design.widget.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
 
                <AutoCompleteTextView
                    android:id="@+id/email"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:hint="@string/prompt_email"
                    android:maxLines="1"
                    android:singleLine="true" />
 
            </android.support.design.widget.TextInputLayout>
 
            <android.support.design.widget.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
 
                <EditText
                    android:id="@+id/password"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:hint="@string/prompt_password"
                    android:imeActionId="6"
                    android:imeActionLabel="@string/action_sign_in_short"
                    android:imeOptions="actionUnspecified"
                    android:inputType="textPassword"
                    android:maxLines="1"
                    android:singleLine="true" />
 
            </android.support.design.widget.TextInputLayout>
 
            <Button
                android:id="@+id/email_sign_in_button"
                style="?android:textAppearanceSmall"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="16dp"
                android:text="@string/action_sign_in"
                android:textStyle="bold" />
 
        </LinearLayout>
    </ScrollView>
</LinearLayout>

И Settings:
package com.myapp.myappandroid;
 
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
 
public class SettingsActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);
 
        Intent intent = this.getIntent();
        EditText apiEndPoint = findViewById(R.id.settingsApiEndPoint);
        apiEndPoint.setText(intent.getStringExtra("apiEndPount"));
        EditText apiKey = findViewById(R.id.settingsApiKey);
        apiKey.setText(intent.getStringExtra("apiKey"));
 
        Button ssBtn = findViewById(R.id.saveSettingsBtn);
        ssBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                saveSettings(view);
            }
        });
    }
 
    public void saveSettings(View view) {
        Intent answerIntent = new Intent(SettingsActivity.this, LoginActivity.class);
        EditText apiEndPoint = findViewById(R.id.settingsApiEndPoint);
        answerIntent.putExtra("apiEndPoint", apiEndPoint.getText());
        EditText apiKey = findViewById(R.id.settingsApiKey);
        answerIntent.putExtra("apiKey", apiKey.getText());
 
        setResult(RESULT_OK, answerIntent);
        finish();
    }
}

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.LinearLayoutCompat
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.myapp.myappandroid.SettingsActivity">
 
    <EditText
        android:id="@+id/settingsApiEndPoint"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/settings_end_point_hint"/>
 
    <EditText
        android:id="@+id/settingsApiKey"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/settings_api_key"/>
 
    <android.support.v7.widget.AppCompatButton
        android:id="@+id/saveSettingsBtn"
        style="?android:textAppearanceSmall"
        android:layout_marginTop="16dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/setings_save_button_text"
        android:textStyle="bold" />
 
</android.support.v7.widget.LinearLayoutCompat>


Вот файл манифеста:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.myapp.myappandroid">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:label="List of Mobile OS"
            android:name=".LoginActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".SettingsActivity" />
    </application>

</manifest>


Пытаюсь передавать параметры из одной в другую. Перед отправкой проверяю дебагером - в обоих случаях intent в Extras содержат введённые значения. На приёмном конце проверяю - Extras в обоих случаях пустые. Т.е не содержит пустые значения с указанными именами, а пустой, от слова "вообще".

В чём может быть дело? Что делаю не так? Где смотреть? Куда копать?

P.S. Не знаю, насколько это важно, но LoginActivity изначально была google LoginActivity, я убрал всё, кроме полей ввода данных.
  • Вопрос задан
  • 55 просмотров
Решения вопроса 1
@Abejon Автор вопроса
Оказалось, что getText возвращает не строковое значение, а Editable. Правильно dj второй activity писать вот так:

answerIntent.putExtra("apiEndPoint", apiEndPoint.getText().toString());

Добавление выделено жирным шрифтом. Т.е. я помещал в Extras не примитивный тип, как это требуется.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
Amigoweb Магнитогорск
от 40 000 до 60 000 руб.
Pandorika-IT Тула
от 30 000 до 100 000 руб.
Blogman Оренбург
от 20 000 до 110 000 руб.
22 авг. 2018, в 08:57
113 руб./за 1000 зн.
22 авг. 2018, в 08:50
10000 руб./за проект
22 авг. 2018, в 06:57
150 руб./в час