【问题标题】:How to send second image using putExtra without replacing the first one如何使用 putExtra 发送第二个图像而不替换第一个图像
【发布时间】:2017-07-20 14:27:17
【问题描述】:

我是 android 新手,我刚刚意识到 .putExtra 是如何工作的。我想将来自两个不同活动的 2 个不同图像发送到我的主活动中的两个不同图像视图中。我尝试这样做,但每次我选择第二张图片时,第一张图片都会被我的默认图片替换。这是我的代码,任何帮助将不胜感激

我的主要活动:

public class MainActivity extends AppCompatActivity {
TextView champ1;
TextView champ2;
private ImageView image;
private ImageView image2;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //--INITIALISING IMAGEVIEW--//
    image = (ImageView)findViewById(R.id.champ1);
    image2 = (ImageView)findViewById(R.id.champ2);
    ImageView image3 = (ImageView)findViewById(R.id.vs);

    //--SETTING RESOURCES FROM ANOTHER ACTIVITY--//
    image.setImageResource(getIntent().getIntExtra("myImageResource",R.drawable.random));
    image2.setImageResource(getIntent().getIntExtra("myImageResource2",R.drawable.random));
    image3.setImageResource(R.drawable.vssymbol);
    //--SETTINGS TEXT FROM ANOTHER ACTIVITY--//
    champ1=(TextView) findViewById(R.id.textview1);
    champ1.setText(getIntent().getStringExtra("message"));
    champ2=(TextView)findViewById(R.id.textview2);
    champ2.setText(getIntent().getStringExtra("message2"));


    //--PICK CHAMP BUTTONS--//
    Button champselect1 = (Button)findViewById(R.id.champselect1);
    Button champselect2 = (Button)findViewById(R.id.champselect2);

    //------------------//
    champselect1.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v){

                Intent intent = new Intent(MainActivity.this, pickchamp.class);
                startActivity(intent);

        }
    });

    champselect2.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v){
            Intent intent = new Intent(MainActivity.this, pickchamp2.class);
            startActivity(intent);
        }
    });
}
}

这是我想从中获取图片的第一个活动

public class pickchamp2 extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    setTheme(R.style.AppTheme_Dialog);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_pickchamp2);
    getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

    //--DECLARING IMAGEBUTTONS--//
    ImageButton ab = (ImageButton)findViewById(R.id.ab);
    ImageButton av = (ImageButton)findViewById(R.id.av);
    ImageButton ac = (ImageButton)findViewById(R.id.ac);

    //--ONCLICKLISTENERS--//
    ab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent champ2= new Intent(pickchamp2.this,MainActivity.class);
            champ2.putExtra("myImageResource2", R.drawable.ab);
            champ2.putExtra("message2", "ab");
            startActivity(champ2);
        }
    });
    av.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent champ2= new Intent(pickchamp2.this,MainActivity.class);
            champ2.putExtra("myImageResource2", R.drawable.av);
            champ2.putExtra("message2", "av");
            startActivity(champ2);
        }
    });
    ac.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent champ2= new Intent(pickchamp2.this,MainActivity.class);
            champ2.putExtra("myImageResource2", R.drawable.ac);
            champ2.putExtra("message2", "ac");
            startActivity(champ2);
        }
    });
}

}

这是我想选择第二张图片的第二个活动

package com.example.alex.matchups;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;

public class pickchamp extends MainActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    setTheme(R.style.AppTheme_Dialog);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_pickchamp);
    getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, 
ViewGroup.LayoutParams.MATCH_PARENT);
    //--DECLARING IMAGEBUTTONS--//
    ImageButton ab2= (ImageButton)findViewById(R.id.ab2);
    ImageButton av2= (ImageButton)findViewById(R.id.av2);
    ImageButton ac2= (ImageButton)findViewById(R.id.ac2);


    //--ONCLICKLISTENERS--//
    ab2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent act2= new Intent(pickchamp.this,MainActivity.class);
            act2.putExtra("myImageResource", R.drawable.ab2);
            act2.putExtra("message", "ab");
            startActivity(act2);
        }
    });
    av2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent act2= new Intent(pickchamp.this,MainActivity.class);
            act2.putExtra("myImageResource", R.drawable.av2);
            act2.putExtra("message", "av2");
            startActivity(act2);
        }
    });
    ac2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent act2= new Intent(pickchamp.this,MainActivity.class);
            act2.putExtra("myImageResource", R.drawable.ac2);
            act2.putExtra("message", "ac2");
            startActivity(act2);
        }
    });
}}

真的非常感谢

【问题讨论】:

    标签: android android-intent android-imageview android-drawable android-imagebutton


    【解决方案1】:

    您需要的,可以通过使用 onActivityResult 来完成。首先从主 Activity 中删除以下代码。

    //--SETTING RESOURCES FROM ANOTHER ACTIVITY--//
    image.setImageResource(getIntent().getIntExtra("myImageResource",R.drawable.random));
    image2.setImageResource(getIntent().getIntExtra("myImageResource2",R.drawable.random));
    

    现在您必须覆盖 MainActivity 的 onActivityResult 方法。

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode==100){
            if(resultCode==10){
                image.setImageResource(data.getIntExtra("myImageResource",R.drawable.random);
            }else if(resultCode==11){
                image2.setImageResource(getIntent().getIntExtra("myImageResource2",R.drawable.random));
            }
        }
    

    现在,每次您从主活动调用 startActivityForResult() 触发 Intent 时,它都会接受两个参数 Intent 和请求代码。

    Intent intent = new Intent(MainActivity.this, YouTargetClassName.class);
                startActivityForResult(intent,100);
    

    现在在您的 pickchamp 类中替换此代码

    Intent act2= new Intent(pickchamp.this,MainActivity.class);
            act2.putExtra("myImageResource", R.drawable.ab2);
            act2.putExtra("message", "ab");
            startActivity(act2);
    

    下面的代码

    Intent act2= new Intent(pickchamp.this,MainActivity.class);
                act2.putExtra("myImageResource", R.drawable.ab2);
                act2.putExtra("message", "ab");
                setResult(10,act2);
                finish();
    

    最后在pickchamp2类替换

    Intent champ2= new Intent(pickchamp2.this,MainActivity.class);
            champ2.putExtra("myImageResource2", R.drawable.av);
            champ2.putExtra("message2", "av");
            startActivity(champ2);
    

    Intent champ2= new Intent(pickchamp2.this,MainActivity.class);
                champ2.putExtra("myImageResource2", R.drawable.av);
                champ2.putExtra("message2", "av");
                setResult(11,champ2);
                finish();
    

    运行您的代码并确认它是否适合您。如果您需要澄清,请随时询问:)

    【讨论】:

    • 就是这样!它有效,非常感谢。你只需要在 else if 语句上更正它的 data.getintdata() 就可以了。!
    【解决方案2】:

    看起来每次创建主要活动时,您都会重置所有图像视图的图像。

    因此,当您使用 Intent 启动 Activity 时,您实际上是在创建一个新对象,它与已经设置了图像的 Activity 不同。当您第二次启动主要活动时,您没有为其中一个图像视图传递参数,因此它将其设置为您指定的默认值。

    image.setImageResource(getIntent().getIntExtra("myImageResource",R.drawable.random)); image2.setImageResource(getIntent().getIntExtra("myImageResource2",R.drawable.random));

    因为您只在启动活动时传入 myImageResource 或 myImageResource2 ,其中一个或另一个将设置为默认值,基本上是您没有传入的那个。

    一个简单的解决方案是检查参数是否存在,如果存在则设置图像视图资源。

    if(getIntent().hasExtra("myImageResource2")) { image2.setImageResource(getIntent().getIntExtra("myImageResource2",R.drawable.random)); } if(getIntent().hasExtra("myImageResource")) { image.setImageResource(getIntent().getIntExtra("myImageResource",R.drawable.random)); }

    【讨论】:

    • 它不工作,老实说我不明白这个检查的整个想法
    • 更改我指定的两行并将它们包装在 if 中
    • if(getIntent().hasExtra("myImageResource")) { image.setImageResource(getIntent().getIntExtra("myImageResource",R.drawable.random)); }
    • 只有在你在意图中传递了一个值时才设置图像
    • 我明白你的意思,但这不是它的工作原理。该应用程序将 2 个图像设置为两个图像视图的默认图像,这是随机图像,并且通过单击 2 个不同的按钮,它会打开 2 个不同的活动,这些活动应该更改 2 个图像视图的图像。如果这样做是删除默认图像并弄乱几乎所有内容。解释的第一部分非常有用。我想我会尝试实现 startFromActivityResult,如果这不起作用,我只会在活动中使用对话框而不是使用多个活动
    【解决方案3】:

    正如 Steven 所说,你每次都在创建新的活动,这样你就无法实现你想要的。

    更好的解决方案是完成您的 pickchamp 活动并将图像传回 MainActivity,而不是创建另一个 MainAcitivity。

    您可以使用 startActivityForResult 将数据发送回 MainActivity,如 here 所述。

    代码

    使用 startActivityForResult 启动您的 pickchamp 和 pickchamp2:

    Intent intent = new Intent(MainActivity.this, pickchamp.class);
    startActivityForResult (intent, 1); //where 1 is the requestCode that you want to use
    
    Intent intent = new Intent(MainActivity.this, pickchamp2.class);
    startActivityForResult (intent, 2); //where 2 is the requestCode that you want to use
    

    并在 MainActivity 中添加/覆盖 onActivityResult

     @Override  
       protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
           super.onActivityResult(requestCode, resultCode, data); 
           if(requestCode == 1) {  
             image.setImageResource(data.getIntExtra("myImageResource",R.drawable.random));  
           }
           else if(requestCode == 2) { 
    image2.setImageResource(data.getIntExtra("myImageResource2",R.drawable.random));
               }
         }  
    

    在 pickchamp 的活动中,您必须将 onClick 替换为类似的方法(以 pickchamp2 为例)

    Intent champ2= new Intent(pickchamp2.this,MainActivity.class);
    champ2.putExtra("myImageResource2", R.drawable.ab);
    champ2.putExtra("message2", "ab");
    setResult(Activity.RESULT_OK, champ2);
    finish();
    

    【讨论】:

    • 您能否再解释一下如何将整个内容导入到我的代码中,因为我对 android 比较陌生,我不太明白
    猜你喜欢
    • 2014-05-20
    • 2022-10-13
    • 2023-03-18
    • 2012-08-01
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多