2012-11-05 10 views
8

Muszę przenieść obraz z jednej czynności do drugiej. W pierwszej czynności użytkownik wybiera obraz z kilku obrazów z widoku przewijania i obraz ten musi być wyświetlany w widoku obrazu następnego działania. Wymagana pomoc.Chcę przenieść obraz z jednej aktywności do innej

+1

minięciu bitmapę od jednej czynności do drugiej jest to zły pomysł. należy rozważyć przekazanie ścieżki lub URI. – minhaz

Odpowiedz

8

W swojej pierwszej działalności

Konwersja ImageView do Bitmap

imageView.buildDrawingCache(); 
    Bitmap bitmap = imageView.getDrawingCache(); 

    Intent intent = new Intent(this, NewActivity.class); 
    intent.putExtra("BitmapImage", bitmap); 

W drugim Aktywny

 Bitmap bitmap = (Bitmap) intent.getParcelableExtra("BitmapImage"); 

następnie wyświetlić bitmapę w ImageView.

Uwaga: nie jest to zalecane. Należy faktycznie zapisać obraz gdzieś i przekazać ścieżkę zamiast i pobrać z drugiej działalności.

+0

Nie działa, ponieważ daje błąd w stosunku do polecenia putExtra i muszę przenieść obraz widoku obrazu, który ma id "imageview" do widoku obrazu następnego działania, które ma id "obrazy". –

+0

zaktualizowałem moją odpowiedź, która powinna ci pomóc. – Raghunandan

+0

dzięki @Raghunandan: dużo szukałem na to pytanie, żadna z nich nie pomogła, twoja odpowiedź zadziałała dla mnie w końcu .. dziękuję –

1

Możesz przekazać identyfikator URI obrazu do następnej aktywności.

URI, które można uzyskać z onActivityResult()

aw onCreate() następnego działania.

Decode bitmapy ponownie i ustaw ją na ImageView

5

można przekazać go jako tablicy bajtów i budować bitmapę do wyświetlenia w następnym działalności. Na przykład:

W swojej pierwszej działalności:

Intent i = new Intent(this, NextActivity.class); 
Bitmap b; // your bitmap 
ByteArrayOutputStream bs = new ByteArrayOutputStream(); 
b.compress(Bitmap.CompressFormat.PNG, 50, bs); 
i.putExtra("byteArray", bs.toByteArray()); 
startActivity(i); 

w drugim aktywności

if(getIntent().hasExtra("byteArray")) { 
    ImageView previewThumbnail = new ImageView(this); 
    Bitmap b = BitmapFactory.decodeByteArray(
     getIntent().getByteArrayExtra("byteArray"),0,getIntent().getByteArrayExtra("byteArray").length);   
    previewThumbnail.setImageBitmap(b); 
} 
+2

putextra nie działa –

0

Zobacz this post.

Użyj putExtra w pierwszym działaniu, gdy rozpoczynasz drugą aktywność. Aw drugim Aktywny używać getExtra() następująco:

W pierwszej czynności

Intent intent = new Intent(Activity1.this,Activity2.class); 
intent.putExtra("bmp",selectedImage); 
startActivity(intent); 

W drugiej Aktywny

Bitmap bmp = this.getIntent().getParcelableExtra("bmp"); 
+0

Właściwie putextra nie działa z –

+0

następnie użyj ByteArrayOutputStream bs = new ByteArrayOutputStream(); b.compress (Bitmap.CompressFormat.PNG, 50, bs); przed putExtras(). –

1

Można to zrobić z wielu sposób. proste jest z zamiarem. ale może zawiesić urządzenie, a także spowodować brak pamięci Wyjątek w wielu urządzeniach takich jak Galaxy S3.

więc dam ci bardzo prosty sposób, patrz poniżej.

można utworzyć static zmienna w jednej klasie, takich jak:.

public class ABC{ 

public static Bitmap PHOTO = null; 

} 

teraz gdy masz bitmapę z galerii lub jakikolwiek inny sposób to trzeba zapisać bitmapę w tej zmiennej fotograficzne (jest to możliwe tylko w onActivityResult , mam rację?)

jeśli otrzymasz zdjęcie z aparatu, to kod jest.

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
startActivityForResult(intent, CAMERA_PIC_REQUEST); 

i

@Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (resultCode == Activity.RESULT_OK) { 

      switch (requestCode) { 
       case CAMERA_PIC_REQUEST: 
        Bitmap b = (Bitmap) data.getExtras().get("data"); 
        if (b != null) { 
         ABC.PHOTO = b; 
        } 
        break; 
} 
} 

i używać tej zmiennej fotograficznego w każdym innym działaniem.

możesz użyć tej samej metody, wybierając zdjęcie z galerii.


Witam to jest edytowane ans.

to tylko przykładowy widok siatki. tutaj masz pojęcie o tym, jak przekazać obraz z jednej aktywności do drugiej.

jest głównym klasa aktywny:

package com.GridViewDemo; 

import java.io.InputStream; 
import java.net.URL; 
import java.util.GregorianCalendar; 

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.graphics.drawable.Drawable; 
import android.os.Bundle; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.BaseAdapter; 
import android.widget.GridView; 
import android.widget.ImageView; 

public class GridViewDemoActivity extends Activity { 
    /** Called when the activity is first created. */ 

    // String[] mArr = 
    // {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"}; 
    String[] mArr = { 
      "http://www.xda-developers.com/wp-content/uploads/2012/10/androidfigure.jpg?f39ce1", 
      "http://1.bp.blogspot.com/-Ramp-o0Cp8s/T0VafXkE4uI/AAAAAAAAAQU/i703zg5MBgI/s1600/android-wallpaper5_1024x768.jpg", 
      "http://www.thebiblescholar.com/android_awesome.jpg", 
      "http://blogs-images.forbes.com/rogerkay/files/2011/07/Android1.jpg" }; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     GridView gridView = (GridView) findViewById(R.id.gridView1); 
     gridView.setAdapter(new ImageAdapter(this)); 

     gridView.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
        long arg3) { 
       // TODO Auto-generated method stub 

       /** if you have bitmap here then you can use this way 
       * Bitmap bitmap = getBitmap(); 
       * test.PHOTO = bitmap; 
       * 
       * */ 
       Intent i = new Intent(GridViewDemoActivity.this, newActiivty.class); 
       i.putExtra("Image_Path", ""+mArr[arg2]); 
       startActivity(i); 
      } 
     }); 
    } 

    public class ImageAdapter extends BaseAdapter { 

     private Context mContext; 

     public ImageAdapter(Context c) { 
      mContext = c; 
     } 

     @Override 
     public int getCount() { 
      // TODO Auto-generated method stub 
      return mArr.length; 
     } 

     @Override 
     public Object getItem(int arg0) { 
      // TODO Auto-generated method stub 
      return null; 
     } 

     @Override 
     public long getItemId(int position) { 
      // TODO Auto-generated method stub 
      return 0; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      // TODO Auto-generated method stub 
      ImageView imgView; 
      if (convertView == null) { 
       imgView = new ImageView(mContext); 
       imgView.setLayoutParams(new GridView.LayoutParams(85, 85)); 
       imgView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
       imgView.setPadding(8, 8, 8, 8); 
      } else { 
       imgView = (ImageView) convertView; 
      } 

      Drawable d = LoadImageFromWebOperations(mArr[position]); 
      if (d == null) { 
       imgView.setImageResource(R.drawable.icon); 
      } else { 
       imgView.setImageDrawable(d); 
      } 
      return imgView; 
     } 

    } 

    public static Drawable LoadImageFromWebOperations(String url) { 
     try { 
      InputStream is = (InputStream) new URL(url).getContent(); 
      Drawable d = Drawable.createFromStream(is, "src name"); 
      return d; 
     } catch (Exception e) { 
      return null; 
     } 
    } 
} 

main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <GridView android:id="@+id/gridView1" android:layout_height="wrap_content" 
     android:layout_width="fill_parent" android:numColumns="4"></GridView> 
</LinearLayout> 

newActivity.class

package com.GridViewDemo; 

import java.io.InputStream; 
import java.net.URL; 

import android.app.Activity; 
import android.graphics.drawable.Drawable; 
import android.os.Bundle; 
import android.widget.ImageView; 

public class newActiivty extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.new_layout); 

     String image_path = getIntent().getStringExtra("Image_Path"); 

     ImageView imageview = (ImageView) findViewById(R.id.imageView1); 

     Drawable d = LoadImageFromWebOperations(image_path); 
     if (d != null) { 
      imageview.setImageDrawable(d); 
     } else { 
      imageview.setImageResource(R.drawable.icon); 
     } 



     /** if you have bitmap then 
     * imageview.setImageBitmap(test.PHOTO); 
     * */ 
    } 

    public static Drawable LoadImageFromWebOperations(String url) { 
     try { 
      InputStream is = (InputStream) new URL(url).getContent(); 
      Drawable d = Drawable.createFromStream(is, "src name"); 
      return d; 
     } catch (Exception e) { 
      return null; 
     } 
    } 

} 

new_layout.xml

<?xml version="1.0" encoding="UTF-8"?> 
<LinearLayout android:id="@+id/linearLayout1" 
    android:layout_width="fill_parent" android:layout_height="fill_parent" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
    <ImageView android:src="@drawable/icon" android:id="@+id/imageView1" 
     android:layout_width="fill_parent" android:layout_height="320dp"></ImageView> 
</LinearLayout> 

plik manifestu

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.GridViewDemo" 
     android:versionCode="1" 
     android:versionName="1.0"> 
    <uses-sdk android:minSdkVersion="3" /> 
    <uses-permission android:name="android.permission.INTERNET"></uses-permission> 

    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity android:name=".GridViewDemoActivity" 
        android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity android:name=".newActiivty"></activity> 

    </application> 
</manifest> 

to ekstra klasa: jeśli masz bitmapę następnie wykorzystać w ten sposób:

package com.GridViewDemo; 

import android.graphics.Bitmap; 

public class test { 

    public static Bitmap PHOTO = null; 

} 

i komentarz w kodzie tak, to sprawdzić, a jeśli masz zapytanie następnie komentarz poniżej tego ans .

+0

Oto kod funkcji, który jest wywoływany, gdy użytkownik naciśnie przycisk "ok" w pierwszej czynności "public void ok" (View view) { \t Intencja intent = new Intent (this, Data.class); EditText editText = (EditText) findViewById (R.id.text); String message = editText.getText(). ToString(); intent.putExtra (EXTRA_MESSAGE, wiadomość); startActivity (zamiar); Zamiar intencyjny1 = nowy cel (szablon.to, klasa danych); ImageView image = (ImageView) findViewById (R.id.imageview); intent1.putExtra ("bmp", obraz); startActivity (zamiar); } –

+0

to jest złe. umieść swój kod w swoim pytaniu. mijasz imageView. musisz przekazać bitmapę lub ścieżkę obrazu, bez względu na to, czego używasz do wyświetlania obrazów w trybie przewijania. –

+0

Muszę przekazać obraz obrazu w pierwszej czynności, której identyfikator jest dobrze widoczny, sugeruję kod –

0

Konwertuj obraz w formacie base64 i przenieś go do następnego działania i ponownie zdekoduj go do bitmapy.

0

W pierwszej czynności:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if(requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK){ 
     Intent showImageIntent = new Intent(this, ShowCameraPicture.class); 
     showImageIntent.fillIn(data,Intent.FILL_IN_DATA); 
     startActivity(showImageIntent); 
    } 
} 

na drugim aktywność:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Bundle bundle = getIntent().getExtras(); 
    if(bundle!=null){ 
     Bitmap image = (Bitmap)bundle.get("data"); 
     //do whatever you need to do with the bitmap here ... 
    }  
}  
0

//////////firstActivity.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.app.myapp.com.app44sendinginfofromoneactivitytoanother.MainActivity"> 

    <RelativeLayout 
     android:layout_width="368dp" 
     android:layout_height="495dp" 
     tools:layout_editor_absoluteX="8dp" 
     tools:layout_editor_absoluteY="8dp"> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_centerHorizontal="true" 
      android:layout_centerVertical="true" 
      android:orientation="vertical"> 

      <EditText 
       android:id="@+id/edtName" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:ems="10" 
       android:hint="Enter NAme" 
       android:inputType="textPersonName" /> 

      <EditText 
       android:id="@+id/edtLastName" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:ems="10" 
       android:hint="Enter LastName" 
       android:inputType="textPersonName" /> 

      <EditText 
       android:id="@+id/edtEmail" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:ems="10" 
       android:hint="Enter Email" 
       android:inputType="textPersonName" /> 

      <EditText 
       android:id="@+id/edtPassword" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:ems="10" 
       android:hint="Enter Password" 
       android:inputType="textPassword" /> 

      <ImageView 
       android:id="@+id/imgView" 
       android:layout_width="match_parent" 
       android:layout_height="200dp" 
       app:srcCompat="@android:drawable/ic_menu_report_image" /> 

      <RadioGroup 
       android:id="@+id/rdoGroup" 
       android:layout_width="match_parent" 
       android:layout_height="50dp"> 

       <RadioButton 
        android:id="@+id/rdoMale" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_weight="1" 
        android:text="Male" /> 

       <RadioButton 
        android:id="@+id/rdoFemale" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_weight="1" 
        android:text="Female" /> 
      </RadioGroup> 

      <Button 
       android:id="@+id/btnSend" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginTop="10dp" 
       android:text="Send" /> 
     </LinearLayout> 
    </RelativeLayout> 

</android.support.constraint.ConstraintLayout> 

//// ////////// MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener,CompoundButton.OnCheckedChangeListener{ 

    EditText edtName,edtLastName,edtEmail,edtPassword; 
    ImageView imgView; 
    RadioButton rdoMale,rdoFemale; 
    Button btnSend; 
    String genderType = ""; 
    int CAMERA_PIC_REQUEST = 99; 
    Bitmap bitmap; // your bitmap 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     edtName = (EditText) findViewById(R.id.edtName); 
     edtLastName = (EditText) findViewById(R.id.edtLastName); 
     edtEmail = (EditText) findViewById(R.id.edtEmail); 
     edtPassword = (EditText) findViewById(R.id.edtPassword); 
     btnSend = (Button) findViewById(R.id.btnSend); 
     imgView = (ImageView) findViewById(R.id.imgView); 
     rdoMale = (RadioButton) findViewById(R.id.rdoMale); 
     rdoFemale = (RadioButton) findViewById(R.id.rdoFemale); 
     btnSend.setOnClickListener(MainActivity.this); 
     imgView.setOnClickListener(MainActivity.this); 
     rdoMale.setOnCheckedChangeListener(MainActivity.this); 
     rdoFemale.setOnCheckedChangeListener(MainActivity.this); 

    } 


    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     switch (buttonView.getId()){ 
      case R.id.rdoMale: 
       if (isChecked){ 
        genderType = "Male"; 
       }else{ 

        buttonView.setChecked(false); 
       } 

       break; 
      case R.id.rdoFemale: 
       if (isChecked){ 
        genderType = "Female"; 
       }else{ 

        buttonView.setChecked(false); 
       } 
       break; 
     } 
    } 

    @Override 
    public void onClick(View v) { 
     switch(v.getId()){ 
      case R.id.btnSend: 

        Intent intent = new Intent(MainActivity.this,SecondActivity.class); 
        intent.putExtra("NAME",edtName.getText().toString()); 
        intent.putExtra("LASTNAME",edtLastName.getText().toString()); 
        intent.putExtra("EMAIL",edtEmail.getText().toString()); 
        intent.putExtra("PASSWORD",edtPassword.getText().toString()); 
        intent.putExtra("GENDER",genderType); 

        //below is the code which you are looking for 

       --> ByteArrayOutputStream bs = new ByteArrayOutputStream(); 
       --> bitmap.compress(Bitmap.CompressFormat.PNG, 100, bs); 
        byte[] byteArray = bs.toByteArray(); 
        intent.putExtra("PICTURE", byteArray); 
        startActivity(intent); 
      break; 
      case R.id.imgView: 
       Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
       startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST); 
       break; 
     } 
    } 



    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode,resultCode,data); 
     if (requestCode == CAMERA_PIC_REQUEST) { 
      bitmap = (Bitmap) data.getExtras().get("data"); 
      imgView.setImageBitmap(bitmap); 

     } 
    } 

} 

//////////////////// SecondActivity.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.app.myapp.com.app44sendinginfofromoneactivitytoanother.ResultActivity"> 

    <RelativeLayout 
     android:layout_width="368dp" 
     android:layout_height="495dp" 
     tools:layout_editor_absoluteX="8dp" 
     tools:layout_editor_absoluteY="8dp"> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_centerHorizontal="true" 
      android:layout_centerVertical="true" 
      android:orientation="vertical"> 

      <TextView 
       android:id="@+id/txtName" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginTop="10dp" 
       android:text="FirstName:" 
       android:textSize="24sp" /> 

      <TextView 
       android:id="@+id/txtLast" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginTop="10dp" 
       android:text="LastName:" 
       android:textSize="24sp" /> 

      <TextView 
       android:id="@+id/txtEmail" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginTop="10dp" 
       android:text="Email:" 
       android:textSize="24sp" /> 

      <TextView 
       android:id="@+id/txtPassword" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginTop="10dp" 
       android:text="Password:" 
       android:textSize="24sp" /> 

      <TextView 
       android:id="@+id/txtGender" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginTop="10dp" 
       android:text="Gender:" 
       android:textSize="24sp" /> 

      <ImageView 
       android:id="@+id/imgViewResult" 
       android:layout_width="match_parent" 
       android:layout_height="200dp" 
       app:srcCompat="@android:drawable/ic_menu_report_image" /> 

     </LinearLayout> 
    </RelativeLayout> 
</android.support.constraint.ConstraintLayout> 

///////// SecondActivity.Java

public class SecondActivity extends AppCompatActivity { 

    Context ctx ; 
    TextView txtName,txtLast,txtEmail,txtPassword,txtGender; 
    ImageView imgViewResult; 
    Bitmap bitmap; 

    @Override 
    protected void onCreate(Bundle bundle) { 
     super.onCreate(bundle); 
     ctx = this; 
     setContentView(R.layout.activity_result); 

     txtName = (TextView) findViewById(R.id.txtName); 
     txtLast = (TextView) findViewById(R.id.txtLast); 
     txtEmail = (TextView) findViewById(R.id.txtEmail); 
     txtPassword = (TextView) findViewById(R.id.txtPassword); 
     txtGender = (TextView) findViewById(R.id.txtGender); 
     imgViewResult = (ImageView) findViewById(R.id.imgViewResult); 

     Bundle extras = getIntent().getExtras(); 
     String Name = extras.getString("NAME"); 
     String LastName = extras.getString("LASTNAME"); 
     String Email = extras.getString("EMAIL"); 
     String Password = extras.getString("PASSWORD"); 
     String Gender = extras.getString("GENDER"); 

     txtName.setText("Name: "+Name); 
     txtLast.setText("LastName: "+LastName); 
     txtEmail.setText("Email: "+Email); 
     txtPassword.setText("Password: "+Password); 
     txtGender.setText("Gender: "+Gender); 

     byte[] byteArray = extras.getByteArray("PICTURE"); 
     bitmap = BitmapFactory.decodeByteArray(byteArray,0,byteArray.length); 
     imgViewResult.setImageBitmap(bitmap); 


    } 

} 

HappyCoding :)

0

w pierwszej Aktywny najpierw upewnij się utworzyć instancję bitmapy na górze jak bitmapy Bitmap;

a następnie użyj tego: - w pierwszym Aktywny

ByteArrayOutputStream bs = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.PNG, 100, bs); 
byte[] byteArray = bs.toByteArray(); 
intent.putExtra("PICTURE", byteArray); 
startActivity(intent); 

aw drugim aktywności: -

byte[] byteArray = extras.getByteArray("PICTURE"); 
bitmap = BitmapFactory.decodeByteArray(byteArray,0,byteArray.length); 
imgViewResult.setImageBitmap(bitmap); 
Powiązane problemy