Turkcell | Geleceği Yazanlar

Fragment Layout, Button onlickListener NullPointerException

Merhabalar,

Yeni android eğitimine başladım.

Eğitim içeriğine göre ilerlemeye çalışıyorum ancak versiyon farklılıklarından dolayı bir yerde takıldım. Eğitimde yeni bir proje oluşturulurken boş bir aktivitede sadece bir tane layout görünüyor. Ancak güncel sdk da ise ekran görüntüsündeki gibi birde fragment layout oluşuyor.

 

Proje açıldığında fragment layout dosyası varsılan olarak önüme geliyor ve içerisinde aşağıdaki gibi bir hello world texview nesnesi oluşuyor.




	<TextView
	    android:id="@+id/textView1"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:text="@string/hello_world" />


	

 

Uygulama ekran dizaynını ilk derste antalıldığı gibi buradan yapmaya devam ediyorum ve bir buton oluşturuyorum




	<Button
	    android:id="@+id/myButton"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:layout_alignParentLeft="true"
	    android:layout_below="@+id/textView1"
	    android:text="@string/merhaba" />


	

 

Varsayılan olarak oluşan main activity class' ım ise şu şekilde




	package com.turkcell.uygulama2;


	import android.support.v7.app.ActionBarActivity;
	import android.support.v7.app.ActionBar;
	import android.support.v4.app.Fragment;
	import android.os.Bundle;
	import android.view.LayoutInflater;
	import android.view.Menu;
	import android.view.MenuItem;
	import android.view.View;
	import android.view.ViewGroup;
	import android.os.Build;


	public class MainActivity extends ActionBarActivity {


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


	  if (savedInstanceState == null) {
	   getSupportFragmentManager().beginTransaction()
	     .add(R.id.container, new PlaceholderFragment()).commit();
	  }
	 }


	 @Override
	 public boolean onCreateOptionsMenu(Menu menu) {


	  // Inflate the menu; this adds items to the action bar if it is present.
	  getMenuInflater().inflate(R.menu.main, menu);
	  return true;
	 }


	 @Override
	 public boolean onOptionsItemSelected(MenuItem item) {
	  // Handle action bar item clicks here. The action bar will
	  // automatically handle clicks on the Home/Up button, so long
	  // as you specify a parent activity in AndroidManifest.xml.
	  int id = item.getItemId();
	  if (id == R.id.action_settings) {
	   return true;
	  }
	  return super.onOptionsItemSelected(item);
	 }


	 /**
	  * A placeholder fragment containing a simple view.
	  */
	 public static class PlaceholderFragment extends Fragment {


	  public PlaceholderFragment() {
	  }


	  @Override
	  public View onCreateView(LayoutInflater inflater, ViewGroup container,
	    Bundle savedInstanceState) {
	   View rootView = inflater.inflate(R.layout.fragment_main, container,
	     false);
	   return rootView;
	  }
	 }


	}


	

 

Sonra main actvitity class' ımın onCreate fonsksiyonuna eğitimdeki gibi buton ile ilgili aksiyonları ekiyorum




	Button btn = (Button) findViewById(R.id.myButton);
	  btn.setOnClickListener(new OnClickListener() {
	   
	   @Override
	   public void onClick(View v) {
	    Toast.makeText(getApplicationContext(), "Merhaba", Toast.LENGTH_LONG).show();
	    Log.d("MainActivity", "Butona Basıldı");
	   }
	  });


	

 

Ancak uygulamayı çalıştıramıyorum hata verip kapanıyor.

 btn.setOnClickListener(new OnClickListener()  tam bu satırda NullPointerException hatası geliyor.

 

anladığım kadarıyla button fragment içerisinde olduğu için null dönüyor.

Bu problem nasıl giderilebilir?

Eğitim içeriğini bu durumu göz önüne alarak güncellemek mümkün mü?

 

Teşekkürler

 

 

 

    +1

    İbrahim Gündüz

    Turkuvaz Medya - 28 Nisan 2014

    merhabalar, Activitylere göre Fragmentlerin yapısı biraz farklıdır. bu farkı internette ki kaynaklardan araştırabilirsiniz.

    sizin çözüme gelecek olursak. sizin burada oluşturuduğunuz butonu onCreate override içinde değilde onCreateView içinde oluşturmanız gerekmektedir. (sorun onCreateView'ın onCreate 'den daha önce çalıştığı ve ekran görüntüsünü oluşturduğudur.

    Butonu oluşturukende

    View rootView = inflater.inflate(R.layout.fragment_main, container, false);

    rootView'den üzerinden findViewById'ı çağırmalısınız.

    Button btn = (Button) rootView.findViewById(R.id.myButton);

    dediğiniz hata oluşma sebebide btn nesnesi oluşurken btn=null şekli ile oluşuyor. O yüzden btn nesnesi üzerinden herhangi bir işlem yapdığınızda nullpoint exception hatası fırlatacaktır.

    0

    Mehmet Yılmaz

    28 Nisan 2014

    Yardımınız için teşekkür ederim. Dediğiniz gibi yapınca çalıştı :)

    Bu soruya cevap vermek için üye olmanız veya giriş yapmanız gerekmektedir.