2017-04-16 84 views
-3

我使用的是自定义布局从一个偏好:自定义布局在首选项使NullPointerException异常

<PreferenceCategory 
    android:title="Intolleranze"> 
    <Preference android:layout="@layout/intolerance_settings" /> 

</PreferenceCategory> 

布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="horizontal" android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<EditText 
    android:id="@+id/editTextIntolerance" 
    android:layout_width="200dp" 
    android:layout_height="wrap_content" 
    android:layout_margin="16dp" 
    android:hint="Aggiungi intolleranza..." /> 


<Button 
    android:id="@+id/addIntoleranceButton" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_margin="16dp" 
    android:background="@drawable/oval_button" 
    android:text="@string/add" 
    android:textColor="@android:color/white" 
    style="?android:attr/borderlessButtonStyle"/> 

</LinearLayout> 

当我尝试从首片段,我得到添加一个onClick监听器NullPointerException,因为我无法获得对PreferenceScreen中设置的自定义布局的引用。我该如何解决这个问题?

PreferenceFragment:

public class SettingsFragment extends PreferenceFragment { 
    private Set<String> set; 
    private Set<String> in; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preferences); 
    } 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = super.onCreateView(inflater, container, savedInstanceState); 
    getActivity().setTitle("Impostazioni"); 
    return view; 
} 

@Override 
public void onViewCreated(View view, Bundle savedIstanceState){ 

    Button addBtn = (Button) findViewById(R.id.addIntoleranceButton); 
    final EditText editText = (EditText) findViewById(R.id.editTextIntolerance); 
    addBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //NullPointerException 
     } 
    }); 
} 
+0

我知道一个NullPointerException是什么。我在这个特殊情况下要问如何避免它。 –

+0

发布您的完整PreferenceFragment类代码 – FAT

+0

我已经发布了整个片段 –

回答

0

尝试使用相关的视图来获取ID:

Button addBtn = (Button) view.findViewById(R.id.addIntoleranceButton); 
onViewCreated(View view, Bundle savedIstanceState)

编辑

移动你的代码到onCreateView()和膨胀的自定义布局:

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.intolerance_settings, container, false); 
     Button addBtn = (Button) rootView.findViewById(R.id.addIntoleranceButton); 
     final EditText editText = (EditText) rootView.findViewById(R.id.editTextIntolerance); 
     addBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

      } 
     }); 
     return rootView; 
    } 

如果那也是不行的,你可以使用PreferenceScreen检查答案Here

+0

我得到了同样的错误 –

+0

我编辑了答案... – rafsanahmad007

0
  1. onCreateView(),使用:

    View view = inflater.inflate(R.layout.intolerance_settings, container, false); 
    

    ,而不是

    View view = super.onCreateView(inflater, container, savedInstanceState); 
    
  2. Move Button,EditText initialization and onClick listener code to onCreateView()

更新您的PreferenceFragment如下:

public class SettingsFragment extends PreferenceFragment { 
    private Set<String> set; 
    private Set<String> in; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preferences); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.intolerance_settings, container, false);  
     getActivity().setTitle("Impostazioni"); 

     Button addBtn = (Button) view.findViewById(R.id.addIntoleranceButton); 
     final EditText editText = (EditText) view.findViewById(R.id.editTextIntolerance); 
     addBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       //Do something 
      } 
     }); 

     return view; 
    } 

    @Override 
    public void onViewCreated(View view, Bundle savedIstanceState){ 

    } 
}