requireActivity().getApplicationContext() “可能会产生 NullPointerExeption”

Posted

技术标签:

【中文标题】requireActivity().getApplicationContext() “可能会产生 NullPointerExeption”【英文标题】:requireActivity().getApplicationContext() "may produce a NullPointerExeption" 【发布时间】:2021-12-01 09:58:56 【问题描述】:

下面是我的应用程序的一些代码。我需要帮助的部分在 SettingFragment.java 中的requireActivity()

MainActivity.java

...
public class MainActivity extends AppCompatActivity 
   
   @Override
   protected void onCreate(Bundle savedInstanceState) 
      ...
   

   public void iniciarIntent3()    //this method is called by a button in activity_main.xml
        Intent intent = new Intent(this, Settings.class);
        startActivityForResult(intent, 1);
   

Settings.java

...

public class Settings extends AppCompatActivity implements SettingsFragment.SendToActivity 
   ...
   @Override
   protected void onCreate(Bundle savedInstanceState) 
      ...
      if (savedInstanceState == null) 
         getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.settings, new SettingsFragment())
            .commit();
      
   

   @Override
   public void onAttachFragment(Fragment fragment) 
      if (fragment instanceof SettingsFragment) 
         SettingsFragment settingsFragment = (SettingsFragment) fragment;
         settingsFragment.setSendToActivity(this);
      
   
   public void send(int result) 
      ...
   
   

SettingsFragment.java

public class SettingsFragment extends PreferenceFragmentCompat 

   SendToActivity callback;

   public void setSendToActivity (SendToActivity callback) 
      this.callback = callback;
   

   public interface SendToActivity 
      void send(int result);
   
   
   if (editTextPreference != null) 
      editTextPreference.setOnBindEditTextListener(new 
      EditTextPreference.OnBindEditTextListener() 
         @Override
         public void onBindEditText(@NonNull EditText editText) 
            editText.setInputType(InputType.TYPE_CLASS_NUMBER);
            editText.setText("");                
            editText.setBackground(ContextCompat.getDrawable(requireActivity()
               .getApplicationContext(), R.drawable.fondo_edittextpreference));
         
      );
   
   ...

我只是想确保 SettingsFragment 类中的 requireActivity() 不会抛出空指针异常。你能帮我检查一下吗?

【问题讨论】:

这完全取决于您执行requireActivity() 调用时片段的状态以及当时它是否附加到活动。您可以通过使用setBackgroundResource() 或从EditText 获取Context 来消除requireActivity() 调用。 @CommonsWare 对,我将使用setBackgroundResource()。谢谢。 【参考方案1】:

您可以执行以下任一操作,而不是 requireActivity().getApplicationContext()

    editText.setBackground(ContextCompat.getDrawable(editText.getContext(), R.drawable.fondo_edittextpreference)) editText.setBackgroundResource(R.drawable.fondo_edittextpreference)

【讨论】:

【参考方案2】:

requireActivity()

如果 Activity 出于任何原因为 null,则可以抛出 null。 我相信如果用户存在应用程序或预先停止它等,它可以为空。或者在你所在的上下文中从未创建过一个

只是尝试捕捉

Activity activity;
try 
    activity = requireActivity()
    editText.setBackground(
        ContextCompat.getDrawable(
            activity.getApplicationContext(),
            R.drawable.fondo_edittextpreference));
 catch (NullPointerException orTypeOfException) 
    //handle here when the activity is null

【讨论】:

好的,谢谢。 这是有缺陷的。 requireActivity() 会抛出异常,但永远不会返回 null。 else 永远不会到达,因为应用程序会崩溃。 正如@Michiel 所说,requireActivity() 的点永远不会为空。通常它用于内联用法,您不希望 lint 在 IDE 中乱扔警告。一般来说,如果您需要 Activity 及其 null,那么逻辑可能有缺陷,应该会引发不可恢复的错误。

以上是关于requireActivity().getApplicationContext() “可能会产生 NullPointerExeption”的主要内容,如果未能解决你的问题,请参考以下文章

区别以及何时使用 getApplication()、getApplicationContext()、getBaseContext() 和 someClass.this

差异以及何时使用getApplication(),getApplicationContext(),getBaseContext()和someClass.this

在空对象引用Error上获取'getActivity()。getApplication()'

对话框抛出“无法添加窗口 - 令牌 null 不适用于应用程序”,getApplication() 作为上下文

Android知识点

如何在android的底部工作表对话框中隐藏软键