2017-05-15 2 views
0

Ich versuche, mein Ziel die Produktion von Aktivität B Aktivität A zu senden, wenn die App schließen ohne Fehlermeldung:Anwendung zu schließen, ohne Fehlermeldungen

Aktivität A:

public class MainActivity extends AppCompatActivity { 
Intent addManualProduct; 
TextView name; 
ImageView img; 

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

    name = (TextView) findViewById(R.id.tv_name); 
    img = (ImageView) findViewById(R.id.iv_product); 

    addManualProduct = new Intent(this, Main2Activity.class); 

    setTitle("ACTIVITY A"); 

    Button openB = (Button) findViewById(R.id.bt_OpenActB); 
    openB.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      startActivityForResult(addManualProduct, 2); 
     } 
    }); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == 2 && resultCode == RESULT_OK){ 
     Product p = data.getParcelableExtra("product_new"); 
     name.setText(p.getName()); 
     img.setImageBitmap(p.getImg()); 
    } 
} 

}

Aktivität B:

public class Main2Activity extends AppCompatActivity { 

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

    setTitle("ACTIVITY B"); 
    Bitmap img = BitmapFactory.decodeResource(getResources(), R.drawable.no_image); 

    Product product = new Product("arroz", img); 
    Intent toA = new Intent(); 
    toA.putExtra("product_new", product); 
    setResult(RESULT_OK, toA); 
    finish(); 
} 

}

Produktobjekt:

public class Product implements Parcelable{ 
String name; 
Bitmap img; 

public Product() {} 

public Product(String name, Bitmap img){ 
    this.name = name; 
    this.img = img; 
} 

protected Product(Parcel in) { 
    name = in.readString(); 
    img = in.readParcelable(Bitmap.class.getClassLoader()); 
} 

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeString(name); 
    dest.writeParcelable(img, flags); 
} 

@Override 
public int describeContents() { 
    return 0; 
} 

public static final Creator<Product> CREATOR = new Creator<Product>() { 
    @Override 
    public Product createFromParcel(Parcel in) { 
     return new Product(in); 
    } 

    @Override 
    public Product[] newArray(int size) { 
     return new Product[size]; 
    } 
}; 

public String getName() { 
    return name; 
} 

public Bitmap getImg() { 
    return img; 
} 

}

Wenn ich nur parcel der String machen seine Werke ok nennen, aber wenn ich versuche, die Bitmap um es alle Anwendungen zu schließen. Ich kann den Fehler sagen, weil die Bitmap, aber ich weiß nicht warum.

+0

Ich denke, Ihr Problem sein kann, die 'ClassLoader' Sie im' Bitmap' zu lesen verwenden. Versuchen Sie, "null" zu übergeben, damit der Standard-ClassLoader verwendet wird. Wenn das nicht funktioniert, ist es möglich, dass die Bitmap zu groß ist und nicht parzelliert werden kann. – Bradford2000

Antwort

0

Das Parzellieren großer Daten kann Probleme in Ihrer Anwendung verursachen. Anstatt die Bitmap zu parzellieren, empfehle ich stattdessen, die Ressource zu parzellieren.

public class Product implements Parcelable { 
    String name; 
    int bitmapResource; 

    public Product(String name, int resource){ 
     this.name = name; 
     this.bitmapResource = resource; 
    } 
} 

Dann können Sie Ihre Product wie folgt verwenden:

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

    setTitle("ACTIVITY B"); 

    Product product = new Product("arroz", R.drawable.no_image); 
    Intent toA = new Intent(); 
    toA.putExtra("product_new", product); 
    setResult(RESULT_OK, toA); 
    finish(); 
} 

Wenn Sie Bitmap s in einer dynamischeren Art und Weise laden, dann können Sie speichern die Uri zu Ihrem Bitmap, so dass es geladen werden kann aus rohen Ressourcen, Assets oder aus einem Service.

+0

Ich werde URI verwenden, wie Sie es empfehlen. Wie auch immer, die Bitmap, die ich tatsächlich benutze, ist ein PNG und es hat 11,39K Größe, kann es als große Daten betrachtet werden? – Aplessed

+0

Ja, ich würde diese großen Daten berücksichtigen. Meine Empfehlung ist, nur kleine Elemente wie Zeichenfolgen, Zahlen, Aufzählungen, andere Parcelable-Modellklassen usw. zu paketieren. – Bradford2000

Verwandte Themen