2014-02-13 3 views
0

Не могу понять, почему, но у меня нет ошибок на eclipse, (простая клавиатура app-button создает новую активность, отправляет в textView и imageView для нового действия), но как только я запустить мое приложение, и я прижимаюсь кнопкой, сбои приложений и я получаю эту ошибку на LogCatimage.setImageDrawable crashes app

Logcat

02-12 17:13:26.297: E/AndroidRuntime(398): Caused by: java.lang.NullPointerException 
02-12 17:13:26.297: E/AndroidRuntime(398): at edu.colum.iam.SecondPage.onCreate(SecondPage.java:38) 

Когда я беру эту строку из (и любой другой линии, которая будет воздействовать на него) приложение работает отлично, и он отправляет мой textView. Вот у меня есть .java, и я просто опубликую xml.

IntentsActivity.java

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

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

    Button btn = (Button)this.findViewById(R.id.button1); 
    btn.setOnClickListener(myListener); 

} 




// Create an anonymous implementation of OnClickListener 
View.OnClickListener myListener = new View.OnClickListener() 
{ 

    public void onClick(View v) { 


Intent myIntent = new Intent(IntentsActivity.this, SecondPage.class); 
     String text = ((TextView)findViewById(R.id.textView1)).getText().toString(); 
     ImageView Selection = ((ImageView) findViewById(R.id.imageView1)); 
     myIntent.putExtra("Text", text); 
     myIntent.putExtra("img", R.drawable.icon); 
or an image) 
     startActivity(myIntent); 
//endclass 

SecondPage.java

public class SecondPage extends Activity { 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.second); 

    //get extras 
    Intent intent = this.getIntent(); 
    Bundle b = intent.getExtras(); 
    String text = b.getString("Text"); 

    //show text 
    TextView tv = (TextView) findViewById(R.id.textView1); 
    tv.setText(text); 

    //show image 
    ImageView image = (ImageView) findViewById(R.id.imageView1); 
    int resource = getIntent().getIntExtra("img", R.drawable.icon); 
    image.setImageDrawable(getResources().getDrawable(resource)); 
    //^this is the line my logcat crashes as an error 

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" 
> 
<TextView 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:text="@string/hello" 
/> 
<Button android:text="@string/Button1" android:id="@+id/button1" 
android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> 

<TextView android:id="@+id/textView1" android:text="@string/FirstLayout" 
android:layout_height="wrap_content" 
android:textAppearance="?android:attr/textAppearanceLarge" 
android:layout_width="wrap_content"></TextView> 

<ImageView 
android:id="@+id/imageView1" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:src="@drawable/icon" /> 

</LinearLayout> 

second.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

<TextView android:layout_width="wrap_content" android:id="@+id/textView1" 
android:text="@string/SecondLayout" 
android:textAppearance="?android:attr/textAppearanceLarge" 
android:layout_height="wrap_content"></TextView> 

<Button android:text="@string/Button2" android:id="@+id/button1"   
android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> 

</LinearLayout> 
+0

'imageView1' находится в основном макете вместо второго макета –

ответ

2

Согласно опубликованному вами 10, imageView1 находится в вашем первом xml не в second.xml, который является тем, который вы надуваете в SecondPage.java, так что естественно, это null, когда вы пытаетесь вызвать метод на нем.

Вам необходимо будет добавить ImageView на ваш second.xml.

+0

Я новичок в Java, поэтому я не хочу ничего испортить, просто скопирую и вставляю ImageView во второй .xml? –

+1

Это должно быть хорошо. Я не вижу никаких свойств, которые могли бы испортить его. Вам просто нужно поместить его туда, где вам это нужно. Вы не можете получить доступ к 'View' в других 'layout', чем тот, который был «завышен», например, вызвав 'setContentView()' или используя 'LayoutInflater' и добавив его в текущий макет. Но, поскольку вы новичок, я бы не стал беспокоиться об этой второй части. – codeMagic

+0

Мы только что узнали об инфляторах вчера на самом деле! спасибо, что это работает, я на самом деле достал строку «android: src =" @ drawable/icon "на second.xml (чтобы убедиться, что она не воссоздает ее на secondpage.java и берет ее из изображения на intentsactivty .java), и он работает! Еще раз спасибо. –

0

Вы можете иметь одинаковые ImageViews в разных файлах макета (я не знаю, почему вы назовете их одинаковыми), а затем получить к ним доступ из вашего кода, если вы установили правильный макет внутри onCreate или где бы вы ни были хотите получить доступ к этим компонентам. Итак, да, просто скопируйте ImageView в файл second.xml и он должен работать.