Soru & Cevap

Fragment Layout, Button onlickListener NullPointerException

27.04.2014 - 08:44

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.

Görsel kaldırıldı.

 

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.

[code]

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

[/code]

 

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

[code]

 <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" />

[/code]

 

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

[code]

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;
        }
    }

}

[/code]

 

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

[code]

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ı");
            }
        });

[/code]

 

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

 

 

 

210 Görüntülenme

2 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

Profile picture for user mehmetyilmaz001
mehmetyilmaz001
28.04.2014 - 09:12

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

picture-6537-1395347261.jpg
igunduz91
28.04.2014 - 01:24

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
[code]View rootView = inflater.inflate(R.layout.fragment_main, container, false);[/code]

rootView'den üzerinden findViewById'ı çağırmalısınız.
[code]Button btn = (Button) rootView.findViewById(R.id.myButton);[/code]

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.