2016-07-29 52 views
2

我有以下代码:意图putExtra位问题

((ImageButton)findViewById(R.id.fish)).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(StartupActivity.this, GameActivity.class); 
      intent.putExtra(NAME_EXTRA, ((EditText)findViewById(R.id.name)).getText().toString().trim()); 
      intent.putExtra(TYPE_EXTRA, FishTypes.FISH.toString()); 
      intent.putExtra(WORLD_TYPE_EXTRA, worldType); 
      intent.putExtra(LOGO_EXTRA, BitmapFactory.decodeResource(getResources(), R.drawable.logo)); 
      startActivity(intent); 
     } 
    }); 

如果我开始活动,并点击它的ImageButton送我到相同的活动我之前(StartupActivity)。但是,如果我注释掉最后putExtra是这样的:

//intent.putExtra(LOGO_EXTRA, BitmapFactory.decodeResource(getResources(), R.drawable.logo)); 

然后它工作正常。它会根据我的需要将我发送到GameActivity。可能是什么问题呢?

编辑

我GameActivity看起来是这样的:

public class GameActivity extends Activity { 

public static GamePanel gamePanel; 
public static String name; 
public static FishTypes type; 
public static String worldType; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 


    requestWindowFeature(getWindow().FEATURE_NO_TITLE); 

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
      WindowManager.LayoutParams.FLAG_FULLSCREEN); 


    name = getIntent().getStringExtra(StartupActivity.NAME_EXTRA); 
    type = FishTypes.parse(getIntent().getStringExtra(StartupActivity.TYPE_EXTRA)); 
    worldType = getIntent().getStringExtra(StartupActivity.WORLD_TYPE_EXTRA); 

    gamePanel = new GamePanel(this); 
    //gamePanel.bitmaps.put("logo", (Bitmap)getIntent().getParcelableExtra(StartupActivity.LOGO_EXTRA)); 
    setContentView(gamePanel); 

    if(!StartupActivity.isNetworkAvailable()) { 
     Toast.makeText(StartupActivity.getInstance(), "You have no internet connection...", Toast.LENGTH_LONG).show(); 
     finish(); 
    } 
} 

@Override 
protected void onDestroy() { 
    if(gamePanel.client != null) 
     gamePanel.client.disconnect(); 
    StartupActivity.getInstance().reopen(); 
    super.onDestroy(); 
} 
} 

我想达成什么是预加载该位图StartupActivity,然后只将其发送到GameActivity到的GamePanel再画在画布上作为加载图像。我无法在GameActivity中加载此图像,因为它显示的时间已晚。你明白吗?

+1

BitmapFactory.decodeResource(getResources(),R.drawable.logo) 它并不需要你可以在你的应用程序在全球层面 –

+0

访问,并绘制你可以告诉我怎么样? – duri

+0

你想在GameActivity.class中使用你的标志吗? –

回答

0

所以首先,有一个Intent有效载荷的限制,据我所知有1MB的限制,但在某些情况下可以500KB。如果超出这个限制,应用程序将崩溃,在您的情况下崩溃并重新启动。

所有的二,BundleIntent用于少量的数据发送到ActivityFragments,通常是一些CONFIGS/PARAMS,所以活性/片段将知道如何建立自身。第三,传播位图实例是一种非常糟糕的做法,您只需要花费一秒的时间就可以在应用程序中创建一个巨大的泄漏,这会花费您很多时间来查找和修复它。

现在,您的解决方案非常简单。您可以传递您要在下一个活动中使用的位图的id

Intent intent = new Intent(StartupActivity.this, GameActivity.class); 
     intent.putExtra(NAME_EXTRA, ((EditText)findViewById(R.id.name)).getText().toString().trim()); 
     intent.putExtra(TYPE_EXTRA, FishTypes.FISH.toString()); 
     intent.putExtra(WORLD_TYPE_EXTRA, worldType); 
     intent.putExtra(LOGO_EXTRA, R.drawable.logo); // R.drawable.logo is actually an int. 
     startActivity(intent); 

在你GameActivity

@Override 
public void onCreate(Bundle savedInstanceState) { 
    setContentView(...) 
    int myAwesomeDrawable = getIntent().getExtra(LOGO_EXTRA, 0); // 0 is default value in case nothing is added to the key 
    if(myAwesomeDrawable != 0){ // safety check 
     imageView.setImageResource(myAwesomeDrawable); 
     // or do whatever you like with it. 
    } 
+0

与我之前写的差不多。在我意识到之前,无论如何都可以在目标活动中访问R.drawable.logo。这就是为什么你不需要传递标志作为额外的。 – AlbAtNf

+0

但我需要它在StartupActivity中预载...这个答案是错误的。我不想在GameActivity中加载它,因为它需要时间来加载,它应该是加载图像。理解? – duri

+0

@duri从资产中加载图片并不需要时间,几乎是即时的。 – danypata