2017-08-26 85 views
10

我有這樣一個簡單的地址形式調用虛擬方法「無效android.view.View.getBoundsOnScreen(android.graphics.Rect)」:的Android - 嘗試上的空對象引用

爪哇:

public class NewAddressActivity extends AppCompatActivity { 

private TextInputLayout mStreetLayout; 
private TextInputLayout mNumberLayout; 
private TextInputLayout mNeighborhoodLayout; 
private TextInputLayout mCityLayout; 
private TextInputLayout mStateLayout; 
private TextInputLayout mCepLayout; 
private TextInputLayout mPhoneLayout; 
private EditText mStreetText; 
private EditText mNumberText; 
private EditText mComplementText; 
private EditText mNeighborhoodText; 
private EditText mCityText; 
private EditText mStateText; 
private EditText mCepText; 
private EditText mPhoneText; 

private Address mAddressEditing; 

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

    ActionBar actionBar = getSupportActionBar(); 
    if (actionBar != null) { 
     actionBar.setDisplayHomeAsUpEnabled(true); 
    } 

    mStreetLayout = findViewById(R.id.street_layout); 
    mNumberLayout = findViewById(R.id.number_layout); 
    mNeighborhoodLayout = findViewById(R.id.neighborhood_layout); 
    mCityLayout = findViewById(R.id.city_layout); 
    mStateLayout = findViewById(R.id.state_layout); 
    mCepLayout = findViewById(R.id.cep_layout); 
    mPhoneLayout = findViewById(R.id.phone_layout); 
    mStreetText = findViewById(R.id.street_text); 
    mNumberText = findViewById(R.id.number_text); 
    mComplementText = findViewById(R.id.complement_text); 
    mNeighborhoodText = findViewById(R.id.neighborhood_text); 
    mCityText = findViewById(R.id.city_text); 
    mStateText = findViewById(R.id.state_text); 
    mCepText = findViewById(R.id.cep_text); 
    mPhoneText = findViewById(R.id.phone_text); 

    mAddressEditing = getIntent().getParcelableExtra(AppConstants.ADDRESS_EXTRA); 

    if (mAddressEditing != null) { 
     getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 
     if (actionBar != null) { 
      actionBar.setTitle(R.string.edit_address); 
     } 
     mStreetText.setText(mAddressEditing.getStreet()); 
     mNumberText.setText(mAddressEditing.getNumber()); 
     mComplementText.setText(mAddressEditing.getComplement()); 
     mNeighborhoodText.setText(mAddressEditing.getNeighborhood()); 
     mCityText.setText(mAddressEditing.getCity()); 
     mStateText.setText(mAddressEditing.getState()); 
     mCepText.setText(mAddressEditing.getCep()); 
     mPhoneText.setText(mAddressEditing.getPhone()); 
     mStreetText.setSelection(mAddressEditing.getStreet().length()); 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.menu_new_address, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case android.R.id.home: 
      finish(); 
      return true; 
     case R.id.action_save: 
      save(); 
      return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

@SuppressLint("StaticFieldLeak") 
private void save() { 
    String street = mStreetText.getText().toString().trim(); 
    String number = mNumberText.getText().toString().trim(); 
    String complement = mComplementText.getText().toString().trim(); 
    String neighborhood = mNeighborhoodText.getText().toString().trim(); 
    String city = mCityText.getText().toString().trim(); 
    String state = mStateText.getText().toString().trim(); 
    String cep = mCepText.getText().toString().trim(); 
    String phone = mPhoneText.getText().toString().trim(); 

    boolean hasError = false; 

    if (TextUtils.isEmpty(street)) { 
     hasError = true; 
     mStreetLayout.setErrorEnabled(true); 
     mStreetLayout.setError(getString(R.string.fill_the_field)); 
    } 
    if (TextUtils.isEmpty(number)) { 
     hasError = true; 
     mNumberLayout.setErrorEnabled(true); 
     mNumberLayout.setError(getString(R.string.fill_the_field)); 
    } 
    if (TextUtils.isEmpty(neighborhood)) { 
     hasError = true; 
     mNeighborhoodLayout.setErrorEnabled(true); 
     mNeighborhoodLayout.setError(getString(R.string.fill_the_field)); 
    } 
    if (TextUtils.isEmpty(city)) { 
     hasError = true; 
     mCityLayout.setErrorEnabled(true); 
     mCityLayout.setError(getString(R.string.fill_the_field)); 
    } 
    if (TextUtils.isEmpty(state)) { 
     hasError = true; 
     mStateLayout.setErrorEnabled(true); 
     mStateLayout.setError(getString(R.string.fill_the_field)); 
    } 
    if (TextUtils.isEmpty(cep)) { 
     hasError = true; 
     mCepLayout.setErrorEnabled(true); 
     mCepLayout.setError(getString(R.string.fill_the_field)); 
    } 
    if (TextUtils.isEmpty(phone)) { 
     hasError = true; 
     mPhoneLayout.setErrorEnabled(true); 
     mPhoneLayout.setError(getString(R.string.fill_the_field)); 
    } 

    if (hasError) { 
     return; 
    } 

    final Address address = new Address(); 
    if (mAddressEditing != null) { 
     mAddressEditing.setStreet(street); 
     mAddressEditing.setNumber(number); 
     mAddressEditing.setComplement(complement); 
     mAddressEditing.setNeighborhood(neighborhood); 
     mAddressEditing.setCity(city); 
     mAddressEditing.setState(state); 
     mAddressEditing.setCep(cep); 
     mAddressEditing.setPhone(phone); 
    } else { 
     address.setStreet(street); 
     address.setNumber(number); 
     address.setComplement(complement); 
     address.setNeighborhood(neighborhood); 
     address.setCity(city); 
     address.setState(state); 
     address.setCep(cep); 
     address.setPhone(phone); 
    } 

    new AsyncTask<Void, Void, Void>() { 
     @Override 
     protected Void doInBackground(Void... voids) { 
      if (mAddressEditing != null) { 
       MainApplication.getInstance().getAddressDao().update(mAddressEditing); 
      } else { 
       MainApplication.getInstance().getAddressDao().insert(address); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      Toast.makeText(NewAddressActivity.this, 
        mAddressEditing != null ? R.string.address_edited_successfully : 
          R.string.address_created_successfully, Toast.LENGTH_SHORT).show(); 
      setResult(Activity.RESULT_OK); 
      finish(); 
     } 
    }.execute(); 
} 
} 

XML:

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="wrap_content"> 

<android.support.constraint.ConstraintLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <android.support.design.widget.TextInputLayout 
     android:id="@+id/street_layout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginEnd="50dp" 
     android:layout_marginLeft="50dp" 
     android:layout_marginRight="50dp" 
     android:layout_marginStart="50dp" 
     android:layout_marginTop="16dp" 
     app:layout_constraintTop_toTopOf="parent"> 


     <EditText 
      android:id="@+id/street_text" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:hint="@string/street" 
      android:imeOptions="actionNext" 
      android:inputType="textCapSentences" 
      android:maxLines="1" 
      android:singleLine="true" /> 
    </android.support.design.widget.TextInputLayout> 

    <android.support.design.widget.TextInputLayout 
     android:id="@+id/number_layout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginEnd="50dp" 
     android:layout_marginLeft="50dp" 
     android:layout_marginRight="50dp" 
     android:layout_marginStart="50dp" 
     android:layout_marginTop="16dp" 
     app:layout_constraintTop_toBottomOf="@id/street_layout"> 

     <EditText 
      android:id="@+id/number_text" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:hint="@string/number" 
      android:imeOptions="actionNext" 
      android:inputType="textCapSentences" 
      android:maxLines="1" 
      android:singleLine="true" /> 
    </android.support.design.widget.TextInputLayout> 

    <android.support.design.widget.TextInputLayout 
     android:id="@+id/complement_layout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginEnd="50dp" 
     android:layout_marginLeft="50dp" 
     android:layout_marginRight="50dp" 
     android:layout_marginStart="50dp" 
     android:layout_marginTop="16dp" 
     app:layout_constraintTop_toBottomOf="@id/number_layout"> 

     <EditText 
      android:id="@+id/complement_text" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:hint="@string/complement" 
      android:imeOptions="actionNext" 
      android:inputType="textCapSentences" 
      android:maxLines="1" 
      android:singleLine="true" /> 
    </android.support.design.widget.TextInputLayout> 

    <android.support.design.widget.TextInputLayout 
     android:id="@+id/neighborhood_layout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginEnd="50dp" 
     android:layout_marginLeft="50dp" 
     android:layout_marginRight="50dp" 
     android:layout_marginStart="50dp" 
     android:layout_marginTop="16dp" 
     app:layout_constraintTop_toBottomOf="@id/complement_layout"> 

     <EditText 
      android:id="@+id/neighborhood_text" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:hint="@string/neighborhood" 
      android:imeOptions="actionNext" 
      android:inputType="textCapSentences" 
      android:maxLines="1" 
      android:singleLine="true" /> 
    </android.support.design.widget.TextInputLayout> 

    <android.support.design.widget.TextInputLayout 
     android:id="@+id/city_layout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginEnd="50dp" 
     android:layout_marginLeft="50dp" 
     android:layout_marginRight="50dp" 
     android:layout_marginStart="50dp" 
     android:layout_marginTop="16dp" 
     app:layout_constraintTop_toBottomOf="@id/neighborhood_layout"> 

     <EditText 
      android:id="@+id/city_text" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:hint="@string/city" 
      android:imeOptions="actionNext" 
      android:inputType="textCapSentences" 
      android:maxLines="1" 
      android:singleLine="true" /> 
    </android.support.design.widget.TextInputLayout> 

    <android.support.design.widget.TextInputLayout 
     android:id="@+id/state_layout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginEnd="50dp" 
     android:layout_marginLeft="50dp" 
     android:layout_marginRight="50dp" 
     android:layout_marginStart="50dp" 
     android:layout_marginTop="16dp" 
     app:layout_constraintTop_toBottomOf="@id/city_layout"> 

     <EditText 
      android:id="@+id/state_text" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:hint="@string/state" 
      android:imeOptions="actionNext" 
      android:inputType="textCapSentences" 
      android:maxLines="1" 
      android:singleLine="true" /> 
    </android.support.design.widget.TextInputLayout> 

    <android.support.design.widget.TextInputLayout 
     android:id="@+id/cep_layout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginEnd="50dp" 
     android:layout_marginLeft="50dp" 
     android:layout_marginRight="50dp" 
     android:layout_marginStart="50dp" 
     android:layout_marginTop="16dp" 
     app:layout_constraintTop_toBottomOf="@id/state_layout"> 

     <EditText 
      android:id="@+id/cep_text" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:hint="@string/cep" 
      android:imeOptions="actionNext" 
      android:inputType="number" 
      android:maxLines="1" 
      android:singleLine="true" /> 
    </android.support.design.widget.TextInputLayout> 

    <android.support.design.widget.TextInputLayout 
     android:id="@+id/phone_layout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginEnd="50dp" 
     android:layout_marginLeft="50dp" 
     android:layout_marginRight="50dp" 
     android:layout_marginStart="50dp" 
     android:layout_marginTop="16dp" 
     app:layout_constraintTop_toBottomOf="@id/cep_layout"> 

     <EditText 
      android:id="@+id/phone_text" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:hint="@string/phone" 
      android:imeOptions="actionDone" 
      android:inputType="phone|textCapSentences" 
      android:maxLines="1" 
      android:singleLine="true" /> 
    </android.support.design.widget.TextInputLayout> 
</android.support.constraint.ConstraintLayout> 
</ScrollView> 

你怎麼能對Java的看到,mAddressEditing變量從收到的意圖,當it's不爲空則意味着用戶希望編輯其地址。

所有的字段都被填充預期,但是當我點擊上編輯文本來改變其值它的崩潰......

崩潰:

FATAL EXCEPTION: main 
Process: br.com.fornaro.armariovirtual, PID: 5540 
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.getBoundsOnScreen(android.graphics.Rect)' on a null object reference at android.app.assist.AssistStructure$WindowNode.<init>(AssistStructure.java:484) 
at android.app.assist.AssistStructure.<init>(AssistStructure.java:1908) 
at android.app.ActivityThread.handleRequestAssistContextExtras(ActivityThread.java:3035) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1807) 
at android.os.Handler.dispatchMessage(Handler.java:105) 
at android.os.Looper.loop(Looper.java:164) 
at android.app.ActivityThread.main(ActivityThread.java:6541) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 

我不知道爲什麼它的崩潰。

重現步驟: 1.編輯從先前的畫面傳遞地址對象作爲參數的意圖 2.單擊編輯文本的ADRESS改變它的價值 3.崩潰!

+1

https://stackoverflow.com/questions/45840856/android-8-0-oreo-crash-on-focusing-textinputedittext –

+0

感謝邁克M.!我找到了鏈接的解決方案!如果其他人有同樣的問題,我會添加評論。 –

+0

我會這麼做...謝謝 –

回答

22

每個編輯的文本添加該代碼解決我的問題:

android:importantForAutofill="noExcludeDescendants" 
+0

它只有一個API 26屬性 – JPM

+1

嗨,道格拉斯,這也解決了我的問題,但我不太明白*爲什麼*這是這種情況。爲什麼需要這樣設置?編輯:沒關係,我發現它是一個錯誤w/Android框架https://issuetracker.google.com/issues/62834931 –

+1

用戶仍然可以通過長按一個字段並選擇溢出,在那裏是自動填充。所以有可能仍然會遇到崩潰。 查看此堆棧的解決方案。 https://stackoverflow.com/questions/45840856/android-8-0-oreo-crash-on-focusing-textinputedittext – Azethoth

3

問題是一個已知的Android錯誤。從Google問題跟蹤器建議中,在TextInputEditText上設置提示似乎導致崩潰。僅在TextInputLayout上設置提示可修復崩潰。

如果在TextInputLayout中嵌套的EditText 上設置了提示,則只會發生此問題。我通過在 TextInputLayout上設置提示來解決它。

https://issuetracker.google.com/issues/62834931 評論#28

+1

我更喜歡這個解決方案,而不是android:importantForAutofill =「noExcludeDescendants」 它只是一個API 26屬性 – user2402046

1

坐落在TextInputLayout代替嵌套的EditText暗示。它不會崩潰。

<android.support.design.widget.TextInputLayout 
        android:id="@+id/til1" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:hint="Phone Number"> 
        <EditText 
         android:layout_width="match_parent" 
         android:layout_height="wrap_content" 
         android:id="@+id/login_phone" 
         android:inputType="number" 
         android:singleLine="true" /> 
       </android.support.design.widget.TextInputLayout> 
+0

在OREO上爲我工作。 – Ajji

相關問題