2013-05-12 19 views
8

Gösterdiğim iletişim kutusunun iki Döndürücü var ve bunlardan biri için seçili öğeyi ayarlamak istiyorum (seçim yapılacak öğe setArguments()/getArguments() ile ana etkinlikten iletiliyor)DialogFragment içinde FindViewById - NullPointerException

import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.Dialog; 
import android.content.DialogInterface; 
import android.os.Bundle; 
import android.support.v4.app.DialogFragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.widget.Spinner; 

public class DFrag extends DialogFragment 
{ 
    public Dialog onCreateDialog(Bundle savedInstanceState) 
    { 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());  
    LayoutInflater inflater = getActivity().getLayoutInflater(); 

    builder.setView(inflater.inflate(R.layout.activity_schedule_select_dialog, null)) 
     .setPositiveButton(R.string.ssd_select_positive, new DialogInterface.OnClickListener() 
     {    
      public void onClick(DialogInterface dialog, int which) 
      { 
       mListener.onDialogPositiveClick(DFrag.this);       
      } 
     }) 
     .setNegativeButton(R.string.select_negative, new DialogInterface.OnClickListener() 
     {    
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       mListener.onDialogNegativeClick(DFrag.this); 
       DFrag.this.getDialog().cancel();       
      } 
     }); 

     builder.setInverseBackgroundForced(true); 

     return builder.create();   
    } 


    public void onActivityCreated(Bundle savedInstanceState) 
    {  
     View view = getView(); 

     Spinner spinner = (Spinner) view.findViewById(R.id.ssd_weeksSelectSpinner); 
     spinner.setSelection(getArguments().getInt("SelectWeek")); 

     super.onActivityCreated(savedInstanceState); 
    } 

    public interface DFragListener 
    { 
     public void onDialogPositiveClick(DialogFragment dialog); 
     public void onDialogNegativeClick(DialogFragment dialog); 
    } 

    DFragListener mListener; 


    @Override 
    public void onAttach(Activity activity) 
    { 
     super.onAttach(activity); 
     try 
     { 
      mListener = (DFragListener) activity; 
     } 
     catch (ClassCastException e) 
     { 
      throw new ClassCastException(activity.toString() + " Listener not implemented"); 
     } 
    } 
} 
:

sorun bunun yerine

Spinner spinner = (Spinner) view.findViewById(R.id.ssd_weeksSelectSpinner);

DialogFragment kodu bir NullPointerException olsun, ben spinner alamayan olduğunu İstendiği gibi 63.210

, diyalog düzeni (activity_schedule_select_dialog.xml):

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

    <TextView 
     android:id="@+id/ssd_classLabel" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/select_class_label" 
     android:layout_marginRight="4dip" 
     android:layout_marginLeft="4dip"/> 
    <Spinner 
     android:id="@+id/ssd_classSelectSpinner" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="4dip" 
     android:entries="@array/urnikClasses"/> 

    <TextView 
     android:id="@+id/ssd_weekLabel" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/select_week_label" 
     android:layout_marginRight="4dip" 
     android:layout_marginLeft="4dip"/>  
    <Spinner 
     android:id="@+id/ssd_weeksSelectSpinner" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:entries="@array/weeksArray"/> 

    <CheckBox 
     android:id="@+id/ssd_DefaultChkbox" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/ssd_DefaultChkBoxTxt"/> 


</LinearLayout> 

Logcat:

05-12 13:16:16.288: E/AndroidRuntime(4310): FATAL EXCEPTION: main 
05-12 13:16:16.288: E/AndroidRuntime(4310): java.lang.NullPointerException 
05-12 13:16:16.288: E/AndroidRuntime(4310):  at com.rogy.scks.urnik.DFrag.onActivityCreated(DFrag.java:91) 
05-12 13:16:16.288: E/AndroidRuntime(4310):  at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1468) 
05-12 13:16:16.288: E/AndroidRuntime(4310):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:931) 
05-12 13:16:16.288: E/AndroidRuntime(4310):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088) 
05-12 13:16:16.288: E/AndroidRuntime(4310):  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 
05-12 13:16:16.288: E/AndroidRuntime(4310):  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444) 
05-12 13:16:16.288: E/AndroidRuntime(4310):  at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429) 
05-12 13:16:16.288: E/AndroidRuntime(4310):  at android.os.Handler.handleCallback(Handler.java:725) 
05-12 13:16:16.288: E/AndroidRuntime(4310):  at android.os.Handler.dispatchMessage(Handler.java:92) 
05-12 13:16:16.288: E/AndroidRuntime(4310):  at android.os.Looper.loop(Looper.java:137) 
05-12 13:16:16.288: E/AndroidRuntime(4310):  at android.app.ActivityThread.main(ActivityThread.java:5195) 
05-12 13:16:16.288: E/AndroidRuntime(4310):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-12 13:16:16.288: E/AndroidRuntime(4310):  at java.lang.reflect.Method.invoke(Method.java:511) 
05-12 13:16:16.288: E/AndroidRuntime(4310):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 
05-12 13:16:16.288: E/AndroidRuntime(4310):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 
05-12 13:16:16.288: E/AndroidRuntime(4310):  at dalvik.system.NativeStart.main(Native Method) 
+0

Tanımlamadığınız yerde XML gönderin ssd_weeksSelectSpinner' – m0skit0

+0

İstenen kodu eklemek için orijinal gönderiyi düzenleyin. – Rogy

+0

Bu "activity_schedule_select_dialog.xml" dosyası olduğunu varsayalım mı? Ve lütfen tüm yığın izlemesini de gönderin. – m0skit0

cevap

7

yerine çalışmakla, çözüm Bulunan

Spinner spinner = (Spinner) view.findViewById(R.id.ssd_weeksSelectSpinner); 
spinner.setSelection(getArguments().getInt("SelectWeek")); 
+0

Zamanımı kurtar, teşekkürler! – li2

1

Bu olabilir:

public void onActivityCreated(Bundle savedInstanceState) 
    {  
     View view = getView(); 

     Spinner spinner = (Spinner) view.findViewById(R.id.ssd_weeksSelectSpinner); 
     spinner.setSelection(getArguments().getInt("SelectWeek")); 

     super.onActivityCreated(savedInstanceState); 
    } 

Seni verir Bir NullPointerException, çünkü spinner, zaten seçili değil ve boş olduğunda vity başlar ... Bunu, onItemSelected dinleyiciye koymanız gerekir. http://developer.android.com/guide/topics/ui/controls/spinner.html#SelectListener

DÜZENLEME:

public class SpinnerActivity extends Activity implements OnItemSelectedListener { 
    ... 

    public void onItemSelected(AdapterView<?> parent, View view, 
      int pos, long id) { 
     // An item was selected. You can retrieve the selected item using 
     // parent.getItemAtPosition(pos) 
    } 

    public void onNothingSelected(AdapterView<?> parent) { 
     // Another interface callback 
    } 
} 

fazla bilgi için bu Bkz Ayrıca "R" java dosyalarını almaları gerekir .. ben ithalat listelerinde görmüyorum:

import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.Dialog; 
import android.content.DialogInterface; 
import android.os.Bundle; 
import android.support.v4.app.DialogFragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.widget.Spinner; 

DÜZENLEME 2: spinner için bir dinleyici eklemek için bunu:

Spinner spinner = (Spinner) view.findViewById(R.id.ssd_weeksSelectSpinner); 

spinner.setOnItemSelectedListener(new OnItemSelectedListener() { 
     public void onItemSelected(AdapterView<?> arg0, View v, int position, long id) 
     { 
      // int position is the element you pressed 
     } 
    }); 
+0

Evet, ilk yazımda NullPointerException'ı 'Spinner spinner = (Spinner) view.findViewById (R.id.ssd_weeksSelectSpinner); Dinleyiciyi nasıl uygulayabileceğimi göremiyorum, çünkü hala findViewById() ile görünümü almam gerekiyor ve bu yöntemle görünümü almaya çalıştığımda NullPointerException alıyorum. Ben spinner için seçilen öğeyi ayarlamaya çalışıyorum, böylece kullanıcı spinner'daki (ve spinnerın kullandığı dizi) ilk öğeyi görmek yerine, kullanıcı (örneğin) spinnerdaki 4. maddeyi görecekti. Hala aynı sorun olan R java dosyasını içe aktardım. – Rogy

+0

Cevabı güncelledim. –

2
eklendi ben

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());  
    LayoutInflater inflater = getActivity().getLayoutInflater(); 
    View view = inflater.inflate(R.layout.activity_schedule_select_dialog, null); 

    builder.setView(view) 
     .setPositiveButton(R.string.ssd_select_positive, new DialogInterface.OnClickListener() 
     {    
      public void onClick(DialogInterface dialog, int which) 
      { 
       mListener.onDialogPositiveClick(DFrag.this);       
      } 
     }) 
     .setNegativeButton(R.string.select_negative, new DialogInterface.OnClickListener() 
     {    
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       mListener.onDialogNegativeClick(DFrag.this); 
       DFrag.this.getDialog().cancel();       
      } 
     }); 

için Ve sonunda

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());  
    LayoutInflater inflater = getActivity().getLayoutInflater(); 

    builder.setView(inflater.inflate(R.layout.activity_schedule_select_dialog, null)) 
     .setPositiveButton(R.string.ssd_select_positive, new DialogInterface.OnClickListener() 
     {    
      public void onClick(DialogInterface dialog, int which) 
      { 
       mListener.onDialogPositiveClick(DFrag.this);       
      } 
     }) 
     .setNegativeButton(R.string.select_negative, new DialogInterface.OnClickListener() 
     {    
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       mListener.onDialogNegativeClick(DFrag.this); 
       DFrag.this.getDialog().cancel();       
      } 
     }); 

değiştirildi public Dialog onCreateDialog(Bundle savedInstanceState)

yılında public void onActivityCreated(Bundle savedInstanceState)

görünümü bulmakİlk önce Spinner nesnesini sınıfa bir üye olarak ekleyin.

public class DFrag extends DialogFragment 
{ 
    private Spinner mSpinner; 
    ... 

Sonra() fonksiyonu

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 
    mSpinner.setSelection(getArguments().getInt("SelectWeek")); 
    ... 
} 

Alkış Şimdi onCreateView üzerinde eğiren değerini yerleştirin onCreateDialog() fonksiyonu

public Dialog onCreateDialog(Bundle savedInstanceState) 
{ 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());  
    LayoutInflater inflater = getActivity().getLayoutInflater(); 
    View view = inflater.inflate(R.layout.activity_schedule_select_dialog, null); 
    // Assign spinner 
    mSpinner = (Spinner) view.findViewById(R.id.ssd_weeksSelectSpinner); 
    builder.setView(view); 
    // Set positive and negative buttons here 
    ... 
} 

adresinin spinner görevlendirmek!

+0

Bu gerçek hileyi sunar: bir görünüm değişkenine şişir, bundan dolayı findViewById öğesini çağırın. Teşekkürler! –

İlgili konular