当前位置: 首页 > 知识库问答 >
问题:

未通过PutExtra传递正确的整数

东郭远航
2023-03-14

我的程序显示一行水平滑动的按钮,其中包含艺术作品的文字描述。单击按钮时,ImageActivity启动以显示相应的艺术品。但是,当我点击任何文本按钮时,它总是显示数组中最后一幅画。

我试图将int ID传递给第二个活动,以便一旦单击相应的描述,它将显示正确的绘画。

非常感谢。

以下是我的主要活动:

import android.content.Intent;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;

public class MainActivity extends Activity {

    //CONTAINING PAINTINGS
    private LinearLayout mLinearList;
    private String id;
    private Painting painting;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        //REFERENCE THE SCROLLABLE LAYOUT STRUCTURE IN MAIN_SCREEN.XML
        mLinearList = (LinearLayout) findViewById(R.id.linearList);

        //FILL THE SCROLLABLE LAYOUT STRUCTURE WITH PAINTINGS
        fillTextCarousel();

    }

    private void fillTextCarousel() {

        // POPULATE THE LINEAR LIST CAROUSEL WITH PAINTINGS AND DESCRIPTIONS
        Button buttonItem;

        for (int i = 0; i < RenaissanceDatabase.description.length; i++) {
            //STORE THE INDIVIDUAL PAINTINGS AS BUTTONS
            buttonItem = new Button(this);


            painting = new Painting(RenaissanceDatabase.description[i], RenaissanceDatabase.id[i]);

            //USE THE CONTENT DESCRIPTION PROPERTY TO STORE
            //PAINTING DATA

            buttonItem.setContentDescription(painting.getDescription());
            buttonItem.setText(painting.getDescription());

            //SET AN ONCLICK LISTENER FOR THE TEXT BUTTON
            buttonItem.setOnClickListener(displayPainting);

            //ADD THE IMAGE BUTTON TO THE SCROLLABLE LINEAR LIST
            mLinearList.addView(buttonItem);
        }
    }

    private View.OnClickListener displayPainting = new View.OnClickListener() {
         public void onClick(View btn) {
         // COLLECT THE IMAGE STORED FOR THE PAINTING
             //String Painting_ID = Integer.toString(painting.getId());
             Intent imgIntent = new Intent(getApplicationContext(), ImageActivity.class);
             imgIntent.setAction(imgIntent.ACTION_SEND);
             imgIntent.putExtra("image_id", painting.getId());
             startActivity(imgIntent);

         }
    };

我正在尝试将整数ID传递给:

public class ImageActivity extends Activity {

private Painting painting;
private int index;
private int[] IDs;
private String[] Desc;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my);

    Intent objIntent = getIntent();
    int ID_Val = objIntent.getIntExtra("image_id", 0);
    ImageView art = (ImageView) findViewById(R.id.imageView2);
    art.setImageResource(ID_Val);
}

}

还有绘画数据库,我要从那里获取身份:

public class RenaissanceDatabase {

    public static String description[] = {
            "Venus of Urbino\nTitan, 1538",
            "St. John the Baptist\nLeonardo da Vinci, 1516",
            "Protrait of Baldassare Castiglione\nRaphael, 1515",
            "The Entombent of Christ\nCaravaggio, 1603",
            "Coronation of the Virgin\nFra Angelico, 1435",
            "Mars and Venus\n Sandro Bottcelli, 1483"};

    public static int id[] = {
            R.drawable.painting1, // VENUS OF URBINO
            R.drawable.painting2, // ST.JOHN BAPTIST
            R.drawable.painting3, // BALDASSARE
            R.drawable.painting4, // ENTOMBENT OF CHRIST
            R.drawable.painting5, // CORONOATION
            R.drawable.painting6  // MARS AND VENUS
    };
}

共有2个答案

闾丘谦
2023-03-14

代码的设置方式非常合理。

看看你用来配置一切的循环。

for (int i = 0; i < RenaissanceDatabase.description.length; i++) {
.....
    painting = new Painting(RenaissanceDatabase.description[i], RenaissanceDatabase.id[i]);
...
}

画在这个循环末尾的值是什么?它是数组中最后一个位置的任何东西。

现在查看您的代码以传递ID:

private View.OnClickListener displayPainting = new View.OnClickListener() {
     public void onClick(View btn) {
         ....
         imgIntent.putExtra("image_id", painting.getId());
         .....
     }
};

呈现的代码从未将“当前绘画”更新为被触摸的绘画。你需要弄清楚用户触摸了哪幅画,并使用那幅画的ID。

另一个答案建议将buttonId设置为绘画的id——这有一些问题,所以我个人不建议这样做。

相反,我会使用适配器和ViewHolder模式,并利用ViewHolder来包含这些元数据。这是一个更具可扩展性的解决方案。

冷翼
2023-03-14

为for循环中的每个按钮设置id-

for (int i = 0; i < RenaissanceDatabase.description.length; i++) {
            //STORE THE INDIVIDUAL PAINTINGS AS BUTTONS
            buttonItem = new Button(this);


            painting = new Painting(RenaissanceDatabase.description[i], RenaissanceDatabase.id[i]);

            //USE THE CONTENT DESCRIPTION PROPERTY TO STORE
            //PAINTING DATA

            buttonItem.setId(painting.getId());
....
        }
    }

然后更改你的OnClickListener-

private View.OnClickListener displayPainting = new View.OnClickListener() {
         public void onClick(View btn) {
    ....
             imgIntent.putExtra("image_id", btn.getId());
             startActivity(imgIntent);

         }
    };

 类似资料:
  • 问题内容: 我希望有人可以为我澄清这里发生的事情。我在整数类中挖了一下,但是由于整数 覆盖 了运算符,所以我无法弄清楚出了什么问题。我的问题是这条线: 这是我的推理:我知道java通过值传递(或通过reference的值传递),因此我认为在下面的示例中,整数对象应每次递增。 这是我的预期输出: 这是实际输出。 为什么会这样? 问题答案: 有两个问题: 整数是通过值而不是通过引用传递的。在方法内部更

  • 问题内容: 如何在Python中通过引用传递整数? 我想修改传递给函数的变量的值。我读过Python中的所有内容都是按值传递的,但是必须有一个简单的技巧。例如,在Java中,你可以通过引用类型的,等等。 如何通过引用将整数传递给函数? 最佳做法是什么? 问题答案: 在Python中,这种方式不太有效。Python将引用传递给对象。在函数内部,你有一个对象-你可以随意更改该对象(如果可能)。但是,整

  • 问题内容: 这是我的Java代码: 我这样称呼它: 问题是呼叫保持发布零零零,似乎我没有正确传递x和y。 更新资料 回答之后,我将请求更改为: 服务是: 但我仍然有同样的问题。这是服务器的响应: 您可以在末尾看到零:( 问题答案: (请注意,不是)是表单数据()向其发送了请求的正文,其中您的资源方法应更像 并且以下请求将起作用 注意: 在Windows中,必须使用双引号() 您甚至可以分离键值对

  • full方法使用不同的方法,但值仍然不会传递给mainActivity。总是有一个空的?

  • 我有类BinaryTreeNode(int值)及其左子级和右子级,BinaryTree(int rootVal)具有BinaryTreeNode根,rootVal作为其值。我开发了一个代码来计算树中的节点数(在类BinaryTreeNode中),但由于NullPointerException,它不起作用: 然而,我发现了另一个具有类似策略的解决方案: 我已经理解了为什么我的代码会抛出异常(因为le

  • 类似的问题没有解决我的问题:https://stackoverflow.com/a/36633892/2300773 在基于connect()的场景中使用 通过上下文传递存储区不起作用 由于react-router不将当前param作为上下文提供,所以我选择将当前param作为路由组件中的上下文添加。我可以一直访问组件树下的上下文,直到到达使用connect()设置的子组件为止。页面的初始呈现为子