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

  • BachelorsPadTv

    BachelorsPad

    17 Ocak 2012
  • Damien Hayes

    Damien Hayes

    11 Mart 2008
  • The10HourMan

    The10HourMan

    28 EYLÜL 2012