【问题标题】:Passing values from fragment to activity using extras puts only null values使用 extras 将值从片段传递到活动只放置空值
【发布时间】:2019-03-04 10:38:18
【问题描述】:

我正在尝试将字符串从片段传递到活动,而不是该片段的父级。活动从片段开始。问题是,当我尝试获取字符串时,它返回 null。我不知道为什么。 这是代码: 片段内部:

    loginButton.setOnClickListener(new View.OnClickListener() {
            @SuppressLint("ResourceType")
            @Override
            public void onClick(View v) {
                String email = emailText.getText().toString();
                String password = passwordText.getText().toString();
                String organizationName = orgSpinner.getSelectedItem().toString();
                System.out.println("username loges in for organization " + organizationName + " with email " + email + " and pass : " + password);
                Intent intent = new Intent(getActivity(), HomePageActivity.class);
                GetUserTask task = new GetUserTask();
                task.execute(1);
                Bundle extras = new Bundle();
                extras.putString("WELCOME_MSG", welcomeMsg);
                //intent.putExtra("WELCOME_MSG", welcomeMsg);
                System.out.println("!!"+ extras.getString("WELCOME_MSG"));
                intent.putExtras(extras);
                startActivity(intent);
            }
        });
        return view;
    }

在 HomePageActivity 中我试图读取字符串:

Bundle extras = getIntent().getExtras();
        if (extras != null) {
            //String msg = getIntent().getStringExtra("WELCOME_MSG");
            String msg = extras.getString("WELCOME_MSG");
            System.out.println("HEREEE : " + msg);
            welcomeMsg.setText(msg);
        } else {
            System.out.println("No extras");
        }

来自两个 sout 调用(来自片段和来自活动)我得到空值。 我希望有人能弄清楚我为什么会这样。谢谢你。

【问题讨论】:

  • 不清楚您在哪里定义了welcomeMsg 以及您在哪里为其赋值。请也添加这些代码。
  • 在此处找到的相同内容 welcomeMsg 未在此处找到。您是否尝试过调试应用程序并检查分配给 welcomeMsg 的值?
  • 对不起,我误删了一行。 welcomeMsg 被声明为私有实例变量并被赋值为:welcomeMsg = findViewById(R.id.welcomeTextView);不得不提一下,welcomeMsg 是在 setText 调用之后设置的。
  • 片段welcomeMsg内部是一个私有字符串,并在私有类中设置:code私有类GetUserTask extends AsyncTask { @Override protected User doInBackground(Integer... integers) { UserRepository userRepository = new UserRepository();用户 userData = userRepository.getUser(integers[0]);返回用户数据; } @Override protected void onPostExecute(User user) { welcomeMsg = "Welcome, " + user.getFirstName() + "!"; } }
  • 您正在使用在后台线程中运行的 AsyncTask,在将值分配给 "welcomeMsg = "Welcome, " + user.getFirstName() + "!"; }" 空值之前被放入捆绑包中另一个活动开始了,所以它在另一个活动中得到空值。

标签: android android-activity arguments fragment


【解决方案1】:

我假设您将welcomeMsg 设置为字符串。你可以试试这个:

Intent intent = new Intent(getActivity(), HomePageActivity.class);
intent.putExtra("WELCOME_MSG", welcomeMsg);

在 HomePageActivity 中:

String msg = getIntent().getStringExtra("WELCOME_MSG");

【讨论】:

  • 我误删了一行。 welcomeMsg 是一个声明为私有实例变量的 TextView。我相信问题出在 putExtra 上,因为 getExtras().getString() 的返回值为 null。
【解决方案2】:

因此,welcomeMsg 被设置在 onPostExecute() 方法中,但在它之外显示为 null(因为有 2 个单独的线程)。我创建了一个私有方法来创建 HomePageActivity 的意图并将welcomeMsg 作为额外的发送。这样就可以了。请参阅此问题以详细了解为什么字符串的值在 onPostExecute 方法之外为空:Instance variable of Activity not being set in onPostExecute of AsyncTask or how to return data from AsyncTask to main UI thread。这是修改后的 Fragment:

package com.example.iosif.ongmanagement.fragment;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;

import com.example.iosif.ongmanagement.R;
import com.example.iosif.ongmanagement.activity.HomePageActivity;
import com.example.iosif.ongmanagement.model.User;
import com.example.iosif.ongmanagement.repository.UserRepository;

public class LoginFragment extends Fragment {

    private static final String TAG = "LoginTabFragment";
    private Button loginButton;
    private EditText emailText;
    private EditText passwordText;
    private Spinner orgSpinner;
    private String welcomeMsg;

    public LoginFragment(){

    }
    @Nullable
    @Override
    public View onCreateView(@NonNull final LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.login_fragment, container, false);
        loginButton = (Button) view.findViewById(R.id.loginButton);
        emailText = view.findViewById(R.id.etEmail);
        passwordText = (EditText) view.findViewById(R.id.etPassword);
        orgSpinner = (Spinner) view.findViewById(R.id.organizationsSpinner);

        loginButton.setOnClickListener(new View.OnClickListener() {
            @SuppressLint("ResourceType")
            @Override
            public void onClick(View v) {
                String email = emailText.getText().toString();
                String password = passwordText.getText().toString();
                String organizationName = orgSpinner.getSelectedItem().toString();
                System.out.println("username loges in for organization " + organizationName + " with email " + email + " and pass : " + password);
                GetUserTask task = new GetUserTask();
                task.execute(1);

            }
        });
        return view;
    }

    /*
     * Starts the HomePageActivity and sends as Extra the value for the welcome message
     */
    private void startHomePage(String name){
        Bundle extras = new Bundle();
        extras.putString("WELCOME_MSG", welcomeMsg);
        System.out.println("!!"+ extras.getString("WELCOME_MSG"));
        Intent intent = new Intent(getActivity(), HomePageActivity.class);
        intent.putExtras(extras);
        startActivity(intent);
    }

    private class GetUserTask extends AsyncTask<Integer, Void, User> {

        @Override
        protected User doInBackground(Integer... integers) {
            UserRepository userRepository = new UserRepository();
            User userData = userRepository.getUser(integers[0]);
            return userData;
        }


        @Override
        protected void onPostExecute(User user) {
            welcomeMsg = "Welcome, " + user.getFirstName() + "!";
            System.out.println(welcomeMsg);
            startHomePage(welcomeMsg);
        }
    }

}

功能不完整,因此请仅考虑与此问题相关的代码。开始的活动中的代码保持不变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 2021-02-26
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多