2013-11-12 4 views
0

Я использую макет с вкладками, созданный с помощью мастера, и имею фрагмент, готовый к работе. Я добавил некоторые EditTexts в свой фрагмент, и все готовы к работе, однако при запуске приложения я получаю исключение NullPointerException в объявлении EditText.NullPointerException во фрагменте при добавлении EditText

фрагмент кода:

package com.boreas.snowdaycalculatorsp2; 

import android.content.Context; 
import android.support.v4.app.Fragment; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

public class AdvancedFragment extends Fragment { 
    EditText inSnow, durnStorm, pSnow, pTime, fSnow, wSpeed, sGround; 
    public double inchSnow, durationStorm, peakSnow, peakTime, finalSnow, windSpeed, snowGround, result; 
    TextView results; 
    Button calc; 
    String resInt; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     inSnow = (EditText) getView().findViewById(R.id.inchesSnow); 
     durnStorm = (EditText)getView().findViewById(R.id.durationStorm); 
     pSnow = (EditText) getView().findViewById(R.id.peakRate); 
     pTime = (EditText)getView().findViewById(R.id.peakRateTime); 
     fSnow = (EditText) getView().findViewById(R.id.finalRate); 
     wSpeed = (EditText) getView().findViewById(R.id.windSpeed); 
     sGround = (EditText) getView().findViewById(R.id.snowGround); 
     results = (TextView) getView().findViewById(R.id.resultView); 
     calc = (Button) getView().findViewById(R.id.button); 

     return inflater.inflate(R.layout.advfrag_layout, container, false); 




    } 

} 

фрагмент XML:

<?xml version="1.0" encoding="utf-8"?> 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:background="#000000" 
    android:layout_height="match_parent"> 

    <EditText 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:inputType="numberDecimal" 
     android:ems="10" 
     android:id="@+id/inchesSnow" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentRight="true" 
     android:textColor="#ffffff" 
     android:textColorHint="#ffffff" 
     android:hint="Inches of Snow" 
     android:singleLine="true" /> 

    <EditText 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:inputType="numberDecimal" 
     android:ems="10" 
     android:id="@+id/durationStorm" 
     android:layout_below="@+id/inchesSnow" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentRight="true" 
     android:textColor="#ffffff" 
     android:textColorHint="#ffffff" 
     android:hint="Duration of Storm" 
     android:singleLine="true" /> 

    <EditText 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:inputType="numberDecimal" 
     android:ems="10" 
     android:id="@+id/peakRate" 
     android:layout_below="@+id/durationStorm" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentRight="true" 
     android:hint="Peak Snow Rate" 
     android:textColor="#ffffff" 
     android:textColorHint="#ffffff" 
     android:layout_alignParentStart="false" 
     android:singleLine="true" /> 

    <EditText 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:inputType="numberDecimal" 
     android:ems="10" 
     android:id="@+id/peakRateTime" 
     android:layout_below="@+id/peakRate" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentRight="true" 
     android:hint="Time of Peak Snow Rate" 
     android:textColor="#ffffff" 
     android:textColorHint="#ffffff" 
     android:singleLine="true" /> 

    <EditText 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:inputType="numberSigned" 
     android:ems="10" 
     android:id="@+id/finalRate" 
     android:layout_below="@+id/peakRateTime" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentRight="true" 
     android:textColor="#ffffff" 
     android:textColorHint="#ffffff" 
     android:hint="Final Snow Rate" 
     android:singleLine="true" /> 

    <EditText 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:inputType="numberSigned" 
     android:ems="10" 
     android:id="@+id/windSpeed" 
     android:layout_below="@+id/finalRate" 
     android:layout_alignParentLeft="true" 
     android:hint="Wind Speed" 
     android:textColor="#ffffff" 
     android:textColorHint="#ffffff" 
     android:layout_alignParentRight="true" 
     android:singleLine="true" /> 

    <EditText 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:inputType="numberDecimal" 
     android:ems="10" 
     android:id="@+id/snowGround" 
     android:layout_below="@+id/windSpeed" 
     android:layout_alignParentLeft="true" 
     android:hint="Snow Already on Ground" 
     android:textColor="#ffffff" 
     android:textColorHint="#ffffff" 
     android:layout_alignParentRight="true" 
     android:singleLine="true" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Calculate" 
     android:id="@+id/button" 
     android:layout_below="@+id/snowGround" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="39dp" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:id="@+id/resultView" 
     android:layout_below="@+id/button" 
     android:layout_alignRight="@+id/button" 
     android:layout_marginTop="41dp" 
     android:layout_alignLeft="@+id/button" /> 

</RelativeLayout> 

Основная деятельность:

package com.boreas.snowdaycalculatorsp2; 

import java.util.Locale; 

import android.support.v7.app.ActionBarActivity; 
import android.support.v7.app.ActionBar; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.os.Bundle; 
import android.support.v4.view.ViewPager; 
import android.view.Gravity; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

public class MainActivity extends ActionBarActivity implements ActionBar.TabListener { 

    SectionsPagerAdapter mSectionsPagerAdapter; 
    ViewPager mViewPager; 

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

     // Set up the action bar. 
     final ActionBar actionBar = getSupportActionBar(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     // Create the adapter that will return a fragment for each of the three 
     // primary sections of the activity. 
     mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 

     // Set up the ViewPager with the sections adapter. 
     mViewPager = (ViewPager) findViewById(R.id.pager); 
     mViewPager.setAdapter(mSectionsPagerAdapter); 

     // When swiping between different sections, select the corresponding 
     // tab. We can also use ActionBar.Tab#select() to do this if we have 
     // a reference to the Tab. 
     mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
      @Override 
      public void onPageSelected(int position) { 
       actionBar.setSelectedNavigationItem(position); 
      } 
     }); 

     // For each of the sections in the app, add a tab to the action bar. 
     for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) { 
      // Create a tab with text corresponding to the page title defined by 
      // the adapter. Also specify this Activity object, which implements 
      // the TabListener interface, as the callback (listener) for when 
      // this tab is selected. 
      actionBar.addTab(
        actionBar.newTab() 
          .setText(mSectionsPagerAdapter.getPageTitle(i)) 
          .setTabListener(this)); 
     } 


    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 
     if (id == R.id.action_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
     // When the given tab is selected, switch to the corresponding page in 
     // the ViewPager. 
     mViewPager.setCurrentItem(tab.getPosition()); 
    } 

    @Override 
    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
    } 

    @Override 
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
    } 

    /** 
    * A {@link FragmentPagerAdapter} that returns a fragment corresponding to 
    * one of the sections/tabs/pages. 
    */ 
    public class SectionsPagerAdapter extends FragmentPagerAdapter { 

     public SectionsPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      // getItem is called to instantiate the fragment for the given page. 
      // Return a PlaceholderFragment (defined as a static inner class below). 
      Fragment fragment; 
      switch (position){ 
       case 0: 
        fragment = new BasicFragment(); 
        break; 
       case 1: 
        fragment = new AdvancedFragment(); 
        break; 
       default: 
        throw new IllegalArgumentException("Invalid Section Number"); 
      } 




      return fragment; 
     } 

     @Override 
     public int getCount() { 
      // Show 3 total pages. 
      return 2; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      Locale l = Locale.getDefault(); 
      switch (position) { 
       case 0: 
        return "Basic"; 
       case 1: 
        return "Advanced"; 

      } 
      return null; 
     } 
    } 
} 

Любые идеи о том, что вызывает NullPointerException?

+0

Зачем размещать столько кода, когда у вас есть сообщение, указывающее на проблему? В любом случае вам нужно переместить весь ваш код 'onCreateView()' (кроме последней строки) на 'onViewCreated()'. Обратите внимание, что 'getView()' работает только при возврате 'onCreateView()'. –

ответ

1

Либо вы должны инициализировать представление с использованием представления объекта с помощью Inflater

как это

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
View view=inflater.inflate(R.layout.advfrag_layout, container, false); 
    inSnow = (EditText) view.getView().findViewById(R.id.inchesSnow); 
    durnStorm = (EditText)view.getView().findViewById(R.id.durationStorm); 
    pSnow = (EditText)view. getView().findViewById(R.id.peakRate); 
    pTime = (EditText)view.getView().findViewById(R.id.peakRateTime); 
    fSnow = (EditText)view. getView().findViewById(R.id.finalRate); 
    wSpeed = (EditText)view. getView().findViewById(R.id.windSpeed); 
    sGround = (EditText) view.getView().findViewById(R.id.snowGround); 
    results = (TextView)view. getView().findViewById(R.id.resultView); 
    calc = (Button)view. getView().findViewById(R.id.button); 

    return view; 




} 

Или вы должны инициализировать его в OnActivityCreated как этот

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
// TODO Auto-generated method stub 
super.onActivityCreated(savedInstanceState); 
nSnow = (EditText) getView().findViewById(R.id.inchesSnow); 
    durnStorm = (EditText)getView().findViewById(R.id.durationStorm); 
    pSnow = (EditText) getView().findViewById(R.id.peakRate); 
    pTime = (EditText)getView().findViewById(R.id.peakRateTime); 
    fSnow = (EditText) getView().findViewById(R.id.finalRate); 
    wSpeed = (EditText) getView().findViewById(R.id.windSpeed); 
    sGround = (EditText) getView().findViewById(R.id.snowGround); 
    results = (TextView) getView().findViewById(R.id.resultView); 
    calc = (Button) getView().findViewById(R.id.button); 

}

Примечание: Вы получаете сообщение об ошибке, потому что OnCreateView пытается выполнить до того OnCreate деятельности завершена.

+0

Perfect! Мне пришлось использовать метод onActivityCreated. Спасибо за вашу помощь. –

+0

Любая идея, как разрешить мою: http://stackoverflow.com/questions/39907625/why-is-accessing-textview-of-a-fragment-inside-activity-throwing-an-error – Si8

1

Изменение onCreateView в

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

     View view = inflater.inflate(R.layout.advfrag_layout, container, false); 
     // inflate the layout 
     inSnow = (EditText) view.findViewById(R.id.inchesSnow); 
     // use the inflated view object to initialize edittext 
     durnStorm = (EditText)view.findViewById(R.id.durationStorm); 
     pSnow = (EditText) view.findViewById(R.id.peakRate); 
     pTime = (EditText)view.findViewById(R.id.peakRateTime); 
     fSnow = (EditText)view.findViewById(R.id.finalRate); 
     wSpeed = (EditText) view.findViewById(R.id.windSpeed); 
     sGround = (EditText) view.findViewById(R.id.snowGround); 
     results = (TextView) view.findViewById(R.id.resultView); 
     calc = (Button) view.findViewById(R.id.button); 

     return view; // return view 
     } 
0

Вы должны инициализировать вид, который вы используете, так что знает, где найти свой EditText.

+0

да. Его макет был инициализирован после его EditTexts – theDazzler

1

Вы должны раздуть View в onCreateView

View rootView = inflater.inflate(R.layout.advfrag_layout, 
      container, false); 
inSnow = (EditText) rootView.findViewById(R.id.inchesSnow); 

Это должно решить проблему

Смежные вопросы