【问题标题】:Get Team Code from ViewHolder through Intent通过 Intent 从 ViewHolder 获取团队代码
【发布时间】:2017-05-31 03:19:31
【问题描述】:

当我在 viewHolder 中点击联赛表中的特定球队时,我试图获取每支英超球队的球队代码。我已经成功地能够通过从一项活动到另一项活动的意图发送团队名称和团队位置。我已将团队代码硬编码到我的配置类中的每个团队

我不确定如何解决这个错误。

public static int getCodeFromName(String teamname) {
        switch (teamname) {
            case "Arsenal FC":
                return 57;
            case "AFC Bournemouth":
                return 1044;
            case "Burnley FC":
                return 328;
            case "Chelsea FC":
                return 61;
            case "Crystal Palace FC":
                return 354;
            case "Hull City FC":
                return 322;
            case "Liverpool FC":
                return 164;
            case "Manchester City FC":
                return 65;
            case "Manchester United FC":
                return 66;
            case "Middlesbrough FC":
                return 343;
            case "Southampton FC":
                return 340;
            case "Swansea City":
                return 72;
            case "Leicester City FC":
                return 338;
            case "Everton FC":
                return 62;
            case "West Ham United FC":
                return 563;
            case "Tottenham Hotspur FC":
                return 73;
            case "Watford FC":
                return 346;
            case "West Bromwich Albion FC":
                return 74;
            case "Sunderland AFC":
                return 71;
            case "Stoke City FC":
                return 70;
            default:
                return 0;
        }
    }

下面是我的 OnClick 方法,它适用于其他两个意图(团队名称、位置)

 @Override
    public void onClick(View view) {
        int teamCode = Configs.getCodeFromName(teamNameTxt.getText().toString());

        int position = getLayoutPosition(); // gets item position
        Intent intent = new Intent(view.getContext(), DetailActivity.class);
        intent.putExtra("teamName", teamNameTxt.getText().toString());
        intent.putExtra("position", teamPositionTxt.getText().toString());
        intent.putExtra("teamCode", teamCode);
        view.getContext().startActivity(intent);

最后,在我的 DetailActivity 类中

int teamCode = Integer.parseInt(getIntent().getStringExtra("teamCode")); //ERROR OCCURS HERE

String PlayersURL = "http://api.football-data.org/v1/teams/" + teamCode + "/players";

final String teamName = getIntent().getStringExtra("teamName");
String teamPosition = getIntent().getStringExtra("position");


protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.team_overview);


    rv = (RecyclerView) findViewById(R.id.rv);
    if (rv != null) {
        rv.setLayoutManager(new LinearLayoutManager(this));
    }


    teamNameTV = (TextView) findViewById(R.id.teamNameTV);
    teamNameTV.setText("Name: " + teamName);

    teamPositionTV = (TextView) findViewById(R.id.teamPositionTV);
    teamPositionTV.setText("Position : " + teamPosition);


    button_players = (Button) findViewById(R.id.button_players);
    button_players.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            new PlayerDataDownloader(DetailActivity.this, PlayersURL, rv).execute();
        }
    });

错误代码:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Intent.getStringExtra(java.lang.String)' on a null object reference
                                                                                         at com.example.oisin.premierleaguesocial.activities.DetailActivity.<init>(DetailActivity.java:26)

【问题讨论】:

    标签: android android-intent android-viewholder


    【解决方案1】:

    错误提示您在空对象引用上调用 Intent.getStringExtra(java.lang.String)。查看发生错误的代码,

    int teamCode = Integer.parseInt(getIntent().getStringExtra("teamCode"));
    

    getStringExtra()getIntent() 的返回值上被调用。所以这意味着 getIntent() 正在返回 null。

    此调用发生在任何方法之外的字段初始化程序中。这意味着它在 DetailActivity 的构造函数之前被调用(尽管在超类 Activity 的构造函数之后)。

    更重要的是,getIntent() 的文档说“返回启动此活动的意图”。但是 started 可以是activity's lifecycle 中的一个技术术语。如果查看生命周期图,您可以看到 starting 发生在 Activity 的 创建 之后(即在 Activity 对象的实例化之后)。一个活动可以通过不同的意图启动,甚至创建多次,而其对象不会被实例化一次以上。 (第一次开始时,首先创建,这是必然的。)所以,虽然不是很明显,但“开始这个活动的意图”是有道理的" 可能在创建时间之前不可用,即使超类活动已实例化

    将此初始化代码移动到onCreate(),这是您的大部分活动设置代码应该去的地方。然后你就可以确信activity已经实例化了,超类onCreate()已经完成,应该有一个意图让getIntent()返回。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多