java - FindViewByID fragment 为空

标签 java android android-fragments

我遇到了一些问题。似乎我随机从 findViewById() 返回 null。有时它返回 TextViewLinearLayout ..有时它只是给出 null 异常。

- 这是如果它正确返回的话。 enter image description here - 如果我重新调试它。最终结果会是这样...

而在调试期间的其他时间它将返回 null。

有什么方法可以达到稳定的结果吗?

记录 Java 案例。

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

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

        // Create the adapter that will return a fragment for each of the three
        // primary sections of the app.
        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.new_case, menu);
        return true;
    }

    @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 DummySectionFragment (defined as a static inner class
            // below) with the page number as its lone argument.
            if (position == 0)
            {
            Fragment fragment = new PatientInfoFragment();
            Bundle args = new Bundle();
            fragment.setArguments(args);
            return fragment;
            }
            else if (position == 1)
            {
                Fragment fragment2 = new EncounterFragment();
                Bundle args = new Bundle();
                fragment2.setArguments(args);
                return fragment2;
            }
            else if (position == 2)
            {
                Fragment fragment3 = new ProcedureFragment();
                Bundle args = new Bundle();
                fragment3.setArguments(args);
                return fragment3;
            }
            return null; 
        }

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

        @Override
        public CharSequence getPageTitle(int position) {
            Locale l = Locale.getDefault();
            switch (position) {
            case 0:
                return "Patient Info";
            case 1:
                return "Encounter";
            case 2:
                return "Procedure";
            }
            return null;
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
        case R.id.ProgressBtn:
            openProgress(); 
            break;
        case R.id.SavedCasesBtn:
            openSaveCases();
            break;
        case R.id.action_newcase_save:
            openSave();
            return true;
        case R.id.action_newcase_send:
            openSend();
            return true;
        case R.id.action_settings:
            Intent intent = new Intent(LogACase.this, PrefsActivity.class);
            startActivity(intent);
            break;
        }

        return super.onOptionsItemSelected(item);

    }

    public void openSave()
    {

    }

    public void openSend()
    {
        String encounterValue, procedureValue;

    encounterValue = retrieveEncounterValue();  
  procedureValue = retrieveProcedureValue(); 


    }

    public String retrieveEncounterValue()
    {
        String encounterValue = null;
        //Encounter 
        LinearLayout ListV =(LinearLayout) findViewById(R.id.encounterslist);
        //Get the number of rows - Correct number of row. 
             for(int i = 0 ; i<ListV.getChildCount();i++)
             {
                 //get that row 's listV
                LinearLayout listParent = (LinearLayout) ListV.getChildAt(i);
                //Nested LL is 2nd item of listParent. 
                LinearLayout nestedLL = (LinearLayout)listParent.getChildAt(1);
                //Get the checkbox in that nested. 
                CheckBox cb = (CheckBox) nestedLL.getChildAt(0);

                //If it's checked
                if(cb.isChecked())
                {
                    //take the ID value of the checked and add it to encouterSelected array. 
                    TextView idTV = (TextView) listParent.getChildAt(0);
                    encounterSelected.add(idTV.getText());
                }
             }
             //Sort the array on order before sending it back to NewCases 
           Collections.sort(encounterSelected);
         StringBuilder full = new StringBuilder(); 
          int B = encounterSelected.size();
          if (B != 0)
          {
         encounterValue =  full.append(encounterSelected).toString();
         encounterValue = encounterValue.replaceAll("\\s","");
          }
          else
          {
              encounterValue = "No Encounter Selected";
          }


            //Patient Info 


            history = (CheckBox) findViewById(R.id.checkbox_history);
            physical = (CheckBox) findViewById(R.id.checkbox_physical);
            patientInitial = (EditText) findViewById(R.id.InitialTextEdit);
            locSpinner = (Spinner) findViewById(R.id.locationSpinner);
            dateOfDiagnosis = (EditText) findViewById(R.id.showMyDate);
            siteLocation = locSpinner.getSelectedItem().toString();
            wardClinic = (EditText) findViewById(R.id.WardClinicTextEdit);
            // Declaration into String
            String patientInitialText = patientInitial.getText().toString();
            String dateOfDiagnosisText = dateOfDiagnosis.getText().toString();
            String siteLocationText = locSpinner.getSelectedItem().toString();
            String wardClinicText = wardClinic.getText().toString();
            String historyText = "N";
            String physicalText = "N";

            if (history.isChecked()) {
                historyText = "Y";
            }
            if (physical.isChecked()) {
                physicalText = "Y";
            }

            if (patientInitialText.trim().equals("")) {
                Toast.makeText(this, "Initial cannot be empty ", Toast.LENGTH_SHORT)
                        .show();
            } else if (wardClinicText.trim().equals("")) {
                Toast.makeText(this, "Ward/Clinic Cannot be empty",
                        Toast.LENGTH_SHORT).show();
            }



          return encounterValue; 
    }


    public String retrieveProcedureValue()
    {
        String procedureValue = null;
        LinearLayout ListProcedure =(LinearLayout) findViewById(R.id.procedureslistParent);
        //Get the number of rows - Correct number of row. 
             for(int i = 0 ; i<ListProcedure.getChildCount();i++)
             {
                 //get that row 's listV
                LinearLayout listParent = (LinearLayout) ListProcedure.getChildAt(i);
                //Nested LL is 2nd item of listParent. 
                LinearLayout nestedLL = (LinearLayout)listParent.getChildAt(1);
                //Get the checkbox in that nested. 
                CheckBox cb = (CheckBox) nestedLL.getChildAt(0);

                //If it's checked
                if(cb.isChecked())
                {
                    //take the ID value of the checked and add it to encouterSelected array. 
                    TextView idTV = (TextView) listParent.getChildAt(0);
                    procedureSelected.add(idTV.getText());
                }
             }
             //Sort the array on order before sending it back to NewCases 
           Collections.sort(procedureSelected);
           int B = procedureSelected.size();
           if (B != 0)
           {
         StringBuilder full = new StringBuilder(); 
         procedureValue =  full.append(procedureSelected).toString();
         procedureValue = procedureValue.replaceAll("\\s","");
           }
           else
           {
               procedureValue = "No Procedure Selected";
           }

           return procedureValue;
    }

    public void openProgress()
    {
        Intent progressIntent = new Intent(this, ScanSelected.class);
        progressIntent.putExtra(EXTRA_MESSAGE, "MyProgress");
    startActivity(progressIntent);
    }

    public void openSaveCases()
    {
        Intent savedCaseIntent = new Intent(this, SavedCases.class);
        startActivity(savedCaseIntent);
    }
}

患者信息 fragment

public class PatientInfoFragment extends Fragment{

    public static final String ARG_SECTION_NUMBER = "section_number";

    // DATABASE ADAPTOR
    patientDbAdapter patientDB;
    Context myContext;
    String ID = "0";

    // SPINNER AND SEARCH VIEW
    private SearchView mSearchView;
    private TextView mStatusView;
    private Spinner locationSpinner;

    // DATE SPINNER
    private int mYear;
    private int mMonth;
    private int mDay;

    private TextView mDateDisplay;
    static final int DIALOG_ALERT = 1;

    // declaration
    private EditText patientInitial, dateOfDiagnosis, wardClinic;
    private Spinner locSpinner;
    private CheckBox history, physical;
    private String siteLocation;
    String patientKey = "com.example.app.datetime";
    // Verification
    Boolean fromBase = false;

    //Data From PatientDetails 
    String strValue1 ;
    String strValue2 ; 
    String strValue3 ;
    String strValue4 ;
    String strValue5 ;
    String strValue6 ;
    private String patientID;

    static final int DATE_DIALOG_ID = 0;

    View rootView;

    public PatientInfoFragment() {
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
         rootView = inflater.inflate(R.layout.activity_patient_info,
                container, false);

            history = (CheckBox) rootView.findViewById(R.id.checkbox_history);
            physical = (CheckBox) rootView.findViewById(R.id.checkbox_physical);
            patientInitial = (EditText) rootView.findViewById(R.id.InitialTextEdit);
            locSpinner = (Spinner) rootView.findViewById(R.id.locationSpinner);
            dateOfDiagnosis = (EditText) rootView.findViewById(R.id.showMyDate);
            siteLocation = locSpinner.getSelectedItem().toString();
            wardClinic = (EditText) rootView.findViewById(R.id.WardClinicTextEdit);

            // listener for the Ward/ClinicSpinner
            addListenerOnSpinnerItemSelection();
            //mDateDisplay.setOnClickListener(new View.OnClickListener() {
        //      public void onClick(View v) {
                //   showDatePicker();
            //  }
        //  });
        return rootView;
    }


    private void RetrieveDataFromDatabaseBasedOnID(String paramString) {
        myContext = getActivity();
        // Opening of database
        patientDB = new patientDbAdapter(myContext);
        patientDB.open();

        ID = paramString;
        Cursor mCursor = this.patientDB
                .retrievePatientEntriesBasedOnID(paramString);
        if ((mCursor != null) && (mCursor.getCount() > 0)) {
            mCursor.moveToFirst();

            mCursor.getString(0); // ID
            this.strValue1 = mCursor.getString(1); // Initial
            this.strValue2 = mCursor.getString(2);// Date
            this.strValue3 = mCursor.getString(3);// SiteLocation
            this.strValue4 = mCursor.getString(4);// WardClinic
            this.strValue5 = mCursor.getString(5);// CheckBoxHistory
            this.strValue6 = mCursor.getString(6);// CheckBoxPhysical

            patientInitial = (EditText) rootView.findViewById(R.id.InitialTextEdit);
            locSpinner = (Spinner) rootView.findViewById(R.id.locationSpinner);
            dateOfDiagnosis = (EditText) rootView.findViewById(R.id.showMyDate);
            siteLocation = locSpinner.getSelectedItem().toString();
            wardClinic = (EditText) rootView.findViewById(R.id.WardClinicTextEdit);
            history = (CheckBox) rootView.findViewById(R.id.checkbox_history);
            physical = (CheckBox) rootView.findViewById(R.id.checkbox_physical);

            patientInitial.setText(strValue1);
            dateOfDiagnosis.setText(strValue2);
    //      ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
    //              R.array.location_arrays, android.R.layout.simple_spinner_item);
        //  int S = adapter.getPosition(strValue3);

        //  locSpinner.setSelection(S);
            wardClinic.setText(strValue4);
            if (strValue5.equals("Y")) {
                history.setChecked(true);
            }
            if (strValue6.equals("Y")) {
                physical.setChecked(true);
            }
            fromBase = true;
        } else {
            fromBase = false;
        }
    }

    // Listen to the spinner Item Selection - Completed
    public void addListenerOnSpinnerItemSelection() {
        locationSpinner = (Spinner) rootView.findViewById(R.id.locationSpinner);
        // locationSpinner.setOnItemSelectedListener(new
        // CustomOnItemSelectedListener());
    }

    // Listen to the spinner
    public void addListenerOnButton() {
        // retrieveValue
        locationSpinner = (Spinner) rootView.findViewById(R.id.locationSpinner);
    }

    public void openPatientSearch() {
        Intent patientDetailsIntent = new Intent(myContext, PatientDetails.class);
        //StartActivityForResult doesn't work for fragment
    //  PatientInfo.this.startActivityForResult(patientDetailsIntent, 1);
    }

患者信息 XML。

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/patientTableLayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
        android:paddingTop="@dimen/activity_vertical_margin"
     android:background="@drawable/bg"
    android:shrinkColumns="1"  >

    <!-- 2 columns Row 2 -->
    <!-- Patient Initials Row -->
    <TableRow
        android:id="@+id/tableRow1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="5dip" >

        <TextView
            android:id="@+id/InitialsTextView"
            android:text="Patient Initials:"
            android:textStyle="bold"
                 android:layout_width="wrap_content"
        android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceSmall" />

          <EditText
            android:id="@+id/InitialTextEdit"
            android:layout_span="2"
            android:singleLine="true"
        android:layout_height="wrap_content"
        android:layout_weight="0.6"
            android:inputType="textVisiblePassword"
            android:imeOptions="actionNext"
            android:hint="@string/patient_input" />

    </TableRow>
    <!--  End Of row 1  -->

    <!--  Row 2  -->
    <!-- Date Of Diagnosis Row -->
        <TableRow
        android:id="@+id/tableRow2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="5dip" >

        <TextView
            android:id="@+id/DiagnosisTextView"
                       android:textStyle="bold"
            android:text="Date of Diagnosis:"
            android:textAppearance="?android:attr/textAppearanceSmall" />

          <EditText 
     android:id="@+id/showMyDate"
     android:hint="Enter Date here"
     android:editable="false"
     android:focusableInTouchMode="false"
     android:layout_height="wrap_content"
        android:layout_weight="0.6"/>
    </TableRow>
 <!--  End of row 2 -->

   <!--  Row 3  -->
    <!-- Date Of Diagnosis Row -->
        <TableRow
        android:id="@+id/tableRow3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="5dip" >

        <TextView
            android:id="@+id/LocationTextView"
                       android:textStyle="bold"
            android:text="Site/Location:"
            android:textAppearance="?android:attr/textAppearanceSmall" />

  <Spinner
        android:id="@+id/locationSpinner"
          android:layout_height="wrap_content"
        android:layout_weight="0.6"
        android:entries="@array/location_arrays"
        android:prompt="@string/DateSpinnerText" />

    </TableRow>
 <!--  End of row 3 -->

    <!--  Row 4  -->
    <!-- ward/clinic Row -->
        <TableRow
        android:id="@+id/tableRow4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="5dip" >

        <TextView
            android:id="@+id/WardClinicTextView"
                       android:textStyle="bold"
            android:text="Ward/Clinic:"
            android:textAppearance="?android:attr/textAppearanceSmall" />

         <EditText
            android:id="@+id/WardClinicTextEdit"
             android:layout_height="wrap_content"
        android:layout_weight="0.6"
                  android:singleLine="true"
            android:hint="Good to include bed no." />

    </TableRow>
 <!--  End of row 4 -->


    <!-- edittext span 2 column -->
    <TableRow
        android:id="@+id/tableRow3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="5dip" >

    </TableRow>

    <!-- just draw a red line -->
    <View
        android:layout_height="2dip"
        android:background="#0000FF" />

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

      <CheckBox android:id="@+id/checkbox_history"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
                   android:textStyle="bold"
        android:text="Performed History"
      />


      <CheckBox android:id="@+id/checkbox_physical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
                   android:textStyle="bold"
        android:text="Performed Physical"
        />


    </LinearLayout>

</TableLayout>

最佳答案

由于您似乎“随机”获得有效 View 或 NPE(引号),因此我发现了 ViewPager/Adapter 缓存/回收问题。在寻呼机中设置 setOffscreenPageLimit 以包含所有 3 个 fragment (默认情况下,它默认为任一侧 1 Fragment,IIRC)应该可以解决此问题.

作为建议,我建议将菜单选项放在相关的 fragment 中,而不是放在您的 Activity 中,因为逻辑取决于与特定 fragment 内的 View 相关的数据,这可能或可能当您选择菜单选项时,不会缓存在 ViewPager 中。

我应该注意到,提供仅 fragment 的菜单项是完全可以的,并期望它们与寻呼机透明地工作(即,它们随着 fragment 的出现和消失而出现和消失)。

关于java - FindViewByID fragment 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21057799/

相关文章:

android - 在对话框 fragment 中方向改变目标 fragment 改变后

java - Ruby setter 方法语法 method=(value) - 与 Java 的比较

java - 冗余空检查

java - 如何在 Android Espresso 中的 View 之间导航

java - 即使卸载旧的 apk,Android APK 安装也失败

java - R 无法解析为变量 - 在 Eclipse 中将 Android API 20 更新为新的 API 22 后

java - JAVA中将字符串转换为日期格式(yyyy/MM/dd)

java - Intellij Idea 无法从其他源找到类文件

android - 为什么我们需要 Activity B 来支持 android 设计的多个屏幕

java - onListItemClick()错误: it must override or implement a supertype method