SORU
14 Mayıs 2014, ÇARŞAMBA


OnCreate erişmek manzarası NullPointerException()

Bu sorun sık sık StackOverflow ilan için meşru bir soru.

Bir öğretici takip ediyorum. Yeni bir etkinlik sihirbazını kullanarak oluşturdum. Views üzerinde bir yöntemi çağırmak için çalışırken benim etkinlik onCreate() findViewById() elde NullPointerException olsun.

onCreate() etkinlik:

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

    View something = findViewById(R.id.something);
    something.setOnClickListener(new View.OnClickListener() { ... }); // NPE HERE

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

Düzen XML (fragment_main.xml):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="packagename.MainActivity$PlaceholderFragment" >

    <View
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:id="@ id/something" />

</RelativeLayout>

CEVAP
14 Mayıs 2014, ÇARŞAMBA


Öğretici muhtemelen eskimiş, parça tabanlı bir kullanıcı arabirimi Sihirbazı tarafından oluşturulan tarafından tercih kodu yerine etkinlik temelli bir UI oluşturmak için çalışıyor.

Görünüm aktivite düzeni (activity_main.xml) parça düzeni (fragment_main.xml) değil. onCreate() yaşam döngüsü içinde faaliyet görünüm hiyerarşisi içinde bulmak için çok mu erken, ve null döndürülür. null bir yöntem çağırma NPE neden olur.

Tercih edilen çözüm şişirilmiş parça düzeni rootView 17 *16 çağıran**,: parça kodu taşımaktır

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

  View something = rootView.findViewById(R.id.something); // not activity findViewById()
  something.setOnClickListener(new View.OnClickListener() { ... });

  return rootView;
}

Bir yan not olarak, parça düzeni sonunda etkinliğinin bir parçası parça işlem çalıştırıldıktan sonra findViewById() ile etkinlik ama hiyerarşi ve bulunabilir görünüm olacak. Parça bekleyen işlemler onCreate() sonra super.onStart() içinde idam edilecek.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Canal TekZoom

    Canal TekZoo

    1 NİSAN 2012
  • kimaliz

    kimaliz

    18 Temmuz 2006
  • Madeon

    Madeon

    31 Ocak 2010