android.view.View.findViewById (int) для пустой ссылки на объект (Android Lint) - PullRequest
0 голосов
/ 07 ноября 2018

У меня проблема. Я запускаю Lint в Android Studio, и он восстановил некоторые части моего приложения, но после этого приложение не запускается. Пишет:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.cewe.martin.cewetracking/com.cewe.martin.cewetracking.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)

и я не могу найти, в чем проблема. Я не могу отменить, потому что есть некоторые измененные файлы, поэтому я попытался удалить части, которые не являются типичными для меня, но все равно не запустились. Вот метод создания MainActivity:

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
    private DrawerLayout drawer;

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

        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        drawer = findViewById(R.id.drawer_layout);

        NavigationView navigationView = findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();

        if (savedInstanceState == null) {
            Log.d("START","DO IFU");
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ScanFragment()).commit();
            Log.d("START","ZA GETSUPP");
            navigationView.setCheckedItem(R.id.nav_scan);
        }
    }

Вы можете увидеть Log.d. Первый «DO IFU» показывает, второй нет, так что я думаю, что это может быть в ScanFragment (). Код здесь:

public class ScanFragment extends Fragment {

    private final EditText rucneKod = (EditText) getView().findViewById(R.id.numberInput);

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.fragment_scan, container, false);
        Button skenovaciTlacitko = view.findViewById(R.id.button2);
        skenovaciTlacitko.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                zapnoutSkener();
            }
        });

        Button rucne = view.findViewById(R.id.button3);

        View.OnFocusChangeListener ofcListener = new MyFocusChangeListener();
        rucneKod.setOnFocusChangeListener(ofcListener);

        final InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);

        rucne.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (rucneKod.getText().length() != 0) {
                    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                    odeslat(rucneKod.getText().toString());
                } else {
                    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                    Snackbar snackbar = Snackbar.make(view, R.string.pozadovanKod, Snackbar.LENGTH_LONG);
                    View sbView = snackbar.getView();
                    TextView textView = sbView.findViewById(android.support.design.R.id.snackbar_text);
                    textView.setTextColor(Color.YELLOW);
                    snackbar.show();
                }
            }
        });
        return view;
    }

Может кто-нибудь увидеть проблемный код? Спасибо

Ответы [ 3 ]

0 голосов
/ 07 ноября 2018

Я думаю, что проблема здесь:

private final EditText rucneKod = (EditText) getView().findViewById(R.id.numberInput);

Вы должны вызвать findViewById внутри onCreateView, сразу после надувания макета фрагмента. getView() равно нулю при построении фрагмента, и сохраненные свойства инициализируются до вызова onCreateView.

0 голосов
/ 07 ноября 2018

getView () возвращает представление, возвращаемое onCreateView (LayoutInflater, ViewGroup, Bundle))

Делаем это: private final EditText rucneKod = (EditText) getView().findViewById(R.id.numberInput);

она вызывает функцию getView перед onCreateView функцией, она будет нулевой, что нормально,

Попробуйте переместить экземпляр в функцию onCreateView

Надеюсь, это поможет

0 голосов
/ 07 ноября 2018
private final EditText rucneKod = (EditText) 
getView().findViewById(R.id.numberInput); 

вызывает NPE. Поместите его внутрь OnCreateView и повторите getView() с view

...