簡體   English   中英

NullPointerException與“ getSupportActionBar()。setDisplayHomeAsUpEnabled(true)”嗎?

[英]NullPointerException with “getSupportActionBar().setDisplayHomeAsUpEnabled( true )”?

我收到以下錯誤:

java.lang.RuntimeException:無法啟動活動ComponentInfo {com.weslange.Term_Scheduling / com.weslange.Term_Scheduling.Term_ChangingDetails_Activity}:java.lang.NullPointerException:嘗試調用虛擬方法'int com.weslange.Term_Scheduling.TermData.getTermID( )'在空對象引用上

以下似乎導致了此問題: getSupportActionBar().setDisplayHomeAsUpEnabled( true )

我知道“ getSupportActionBar() ”確實可以工作,因為以下方法可以正常工作: getSupportActionBar().setTitle( "Selecting Courses" )

MainActivity是根父級。 Term_ChangingDetails_Activity.java ”是該活動的子級。 Term_CourseSelection_Activity.java ”是“ Term_CourseSelection_Activity.java ”的子Term_ChangingDetails_Activity.java 前兩個可以通過“ setDisplayHomeAsUpEnabled( true ) ”正常工作。

我認為NullPointerException引用了我的“ Term_ChangingDetails_Activity.java ”文件中的Term_ChangingDetails_Activity.java Term_CourseSelection_Activity.java ”包含異常的來源,該文件中存在“ setDisplayHomeAsUpEnabled( true ) ”時會發生。

我認為“ AndroidManifest.xml ”是正確的,因為如果我在“ Term_ChangingDetails_Activity.java ”中調用“ finish() ”,那么一切都可以正常工作。

感謝您的時間。

編輯01 :(為清楚起見,添加了MainActivity.java。)

MainActivity.java:

public class MainActivity extends AppCompatActivity implements Term_RecyclerView_Adapter.ItemClickListener {

    RecyclerView recyclerView;
    Term_RecyclerView_Adapter adapter;
    TermData test_TermData_Value;

    Database_Handling databaseHandling;
    List< TermData > termsArrayList;
    List< CourseData > coursesArrayList;
    List< MentorData > mentorsArrayList;
    List< AssessmentData > assessmentsArrayList;




    FloatingActionButton floatingActionButton;


    @Override
    protected void onCreate( Bundle savedInstanceState ) {

        super.onCreate( savedInstanceState );
        setContentView( R.layout.activity_main );


        //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        //This section ensures that each of the listings for the "Creation" activities begins with an example.
        databaseHandling = new Database_Handling( this );
        termsArrayList = databaseHandling.getAllTerms();
        coursesArrayList = databaseHandling.getAllCourses();
        mentorsArrayList = databaseHandling.getAllMentors();
        assessmentsArrayList = databaseHandling.getAllAssessments();


        if ( termsArrayList.isEmpty() ) {

            TermData termDataBeginning = new TermData();
            databaseHandling.addTermData( termDataBeginning );

            //This line is necessary for this class, since the "recyclerView" listing needs populating.
            termsArrayList = databaseHandling.getAllTerms();

        }


        if ( coursesArrayList.isEmpty() ) {

            CourseData courseDataBeginning = new CourseData();
            databaseHandling.addCourseData( courseDataBeginning );

        }


        if ( mentorsArrayList.isEmpty() ) {

            MentorData mentorDataBeginning = new MentorData();
            databaseHandling.addMentorData( mentorDataBeginning );

        }


        if ( assessmentsArrayList.isEmpty() ) {

            AssessmentData assessmentDataThing = new AssessmentData();
            databaseHandling.addAssessmentData( assessmentDataThing );

        }
        //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


        recyclerView = findViewById( R.id.recyclerView_Array_in_XML );
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager( this );


        //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(
                recyclerView.getContext(), linearLayoutManager.getOrientation() );
        recyclerView.addItemDecoration( dividerItemDecoration );
        //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


        recyclerView.setLayoutManager( linearLayoutManager );

        adapter = new Term_RecyclerView_Adapter( this, termsArrayList);
        adapter.setClickListener( this );
        recyclerView.setAdapter( adapter );


        floatingActionButton = findViewById( R.id.floatingActionButton_Thing );
        floatingActionButton.setOnClickListener( new View.OnClickListener() {

            @Override
            public void onClick( View view ) {

                int newPosition = ( databaseHandling.getTermDataCount() + 1 );

                TermData termDataThing = new TermData();
                termDataThing.setTermID( newPosition );

                databaseHandling.addTermData( termDataThing );

                //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                //Using this way to re-launch the current activity seems visually better than
                // "recreate()".
                Intent intent = getIntent();
                finish();
                startActivity(intent);
                //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

            }
        });

    }


    @Override
    public boolean onCreateOptionsMenu( Menu menu ) {

        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate( R.menu.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.course_creation ) {

            Intent intent = new Intent( MainActivity.this, CourseCreation_Activity.class );
            startActivity( intent );

            return true;

        }
        //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&


        //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
        if ( id == R.id.mentor_creation ) {


            Intent intent = new Intent( MainActivity.this, MentorCreation_Activity.class );
            startActivity( intent );

            return true;

        }
        //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&


        //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
        if ( id == R.id.assessment_creation ) {

            Intent intent = new Intent( MainActivity.this, AssessmentCreation_Activity.class );
            startActivity( intent );

            return true;

        }
        //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

        return super.onOptionsItemSelected( item );

    }
    //==============================================================================================


    @Override
    public void onItemClick( View view, int position ) {

        //This prepares the "TermData" thing for entering info through "Term_ChangingDetails_Activity".
        Intent intent = new Intent( MainActivity.this, Term_ChangingDetails_Activity.class );
        test_TermData_Value = adapter.getItem( position );

        intent.putExtra( "termData_Parcelable", test_TermData_Value );

        //This ships the info to "Term_ChangingDetails_Activity".
        startActivity( intent );

    }


    @Override
    public void onResume() {

        super.onResume();

        termsArrayList = databaseHandling.getAllTerms();

        //**************************************************************************
        adapter = new Term_RecyclerView_Adapter( this, termsArrayList);
        adapter.setClickListener( this );
        recyclerView.setAdapter( adapter );
        //**************************************************************************

        adapter.notifyDataSetChanged();

    }
}

Term_ChangingDetails_Activity.java:

public class Term_ChangingDetails_Activity extends AppCompatActivity {

    private Button saveButton;

    int termID;

    EditText termName_EditText;
    Button startingDate_Button;
    Button endingDate_Button;
    Button courseSelection_Button;

    Bundle dataArgument_Bundle_Example;
    DialogFragment startingDateFragment;
    DialogFragment endingDateFragment;

    TermData termData_TransferInfo;
    Database_Handling databaseHandling;


    @Override
    protected void onCreate( Bundle savedInstanceState ) {

        super.onCreate( savedInstanceState );

        //The below line is necessary for showing info at all.
        setContentView( R.layout.activity_term_changingdetails);

        databaseHandling = new Database_Handling( this );


        //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
        Intent intent = getIntent();
        final TermData termData_Values = intent.getParcelableExtra( "termData_Parcelable" );
        termID = termData_Values.getTermID();
        //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&


        //This displays a back button on the ToolBar at the top of the Activity.
        getSupportActionBar().setDisplayHomeAsUpEnabled( true );

        //This just changes the title of the ToolBar.
        getSupportActionBar().setTitle( "Changing Term Info" );


        //*****************************************************************
        termName_EditText = findViewById( R.id.termNameXML );
        termName_EditText.setText( termData_Values.getTermName() );

        startingDate_Button = findViewById( R.id.startingDateButtonXML );
        startingDate_Button.setText( termData_Values.getStartingDate() );

        endingDate_Button = findViewById( R.id.endingDateButtonXML );
        endingDate_Button.setText( termData_Values.getEndingDate() );
        //*****************************************************************


        //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        saveButton = findViewById( R.id.saveButtonXML );
        saveButton.setOnClickListener( new View.OnClickListener() {

            @Override
            public void onClick( View view ) {

            termData_TransferInfo = new TermData( termID,
                    termName_EditText.getText().toString(),
                    startingDate_Button.getText().toString(),
                    endingDate_Button.getText().toString() );

            databaseHandling.updateTermData( termData_TransferInfo );
            finish();

            }
        });
        //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


        //TODO START AN ACTIVITY FOR CHOOSING FROM A LIST OF COURSES.
        courseSelection_Button = findViewById( R.id.courseSelection_ButtonXML );
        courseSelection_Button.setOnClickListener( new View.OnClickListener() {

            @Override
            public void onClick( View view ) {

                Intent intent = new Intent( Term_ChangingDetails_Activity.this, Term_CourseSelection_Activity.class );
                startActivity( intent );

            }
        });

    }


    public void reveal_StartingDate_DatePicker( View v ) {

        startingDateFragment = new DatePickerFragment_TERM_StartingDate();
        startingDateFragment.setArguments( dataArgument_Bundle_Example );
        startingDateFragment.show( getFragmentManager(), "starting date picker" );

    }


    public void setStartingDate_in_StartingDate_Button( String startingDate_for_Button ) {

        startingDate_Button.setText( startingDate_for_Button );

    }


    public void reveal_EndingDate_DatePicker( View view ) {

        endingDateFragment = new DatePickerFragment_TERM_EndingDate();
        endingDateFragment.setArguments( dataArgument_Bundle_Example );
        endingDateFragment.show( getFragmentManager(), "ending date picker" );

    }


    public void setEndingDate_in_EndingDate_Button( String endingDate_for_Button ) {

        endingDate_Button.setText( endingDate_for_Button );

    }
}

Term_CourseSelection_Activity.java:

public class Term_CourseSelection_Activity extends AppCompatActivity {

    private Button saveButton;


    @Override
    protected void onCreate( Bundle savedInstanceState ) {

        super.onCreate( savedInstanceState );
        setContentView( R.layout.activity_term_courseselection );

        //This just changes the title of the ToolBar.
        getSupportActionBar().setTitle( "Selecting Courses" );





        //TODO  THE SOFTWARE WORKS FINE WHEN THIS PART IS REMOVED.  OTHERWISE, I GET A 'NullPointerException'.
        //++++++++++++++++++++++++++++++++++++++++++++++++++++++        
        //This displays the "back" button.
        getSupportActionBar().setDisplayHomeAsUpEnabled( true );
        //++++++++++++++++++++++++++++++++++++++++++++++++++++++





        saveButton = findViewById( R.id.saveButtonXML );
        saveButton.setOnClickListener( new View.OnClickListener() {

            @Override
            public void onClick( View view ) {

                finish();

            }
        });

    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    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="match_parent"
    tools:context="com.weslange.Term_Scheduling.MainActivity"

    android:background="?android:attr/selectableItemBackground"
    android:focusable="true"
    android:clickable="true"
    >

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView_Array_in_XML"
        android:layout_width="match_parent"
        android:layout_height="match_parent"

        android:background="?android:attr/selectableItemBackground"
        android:focusable="true"
        android:clickable="true"
        />

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/floatingActionButton_Thing"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="16dp"
        app:srcCompat="@drawable/ic_add_term"
        />

</android.support.design.widget.CoordinatorLayout>

activity_term_changingdetails.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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="match_parent"
    android:gravity="center_horizontal"

    android:orientation="vertical"
    android:scrollbarAlwaysDrawVerticalTrack="true"
    android:scrollbars="vertical"
    android:showDividers="none"

    tools:context="com.weslange.Term_Scheduling.Term_ChangingDetails_Activity"
    >


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="\nPlease Adjust as Necessary"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textStyle="bold"
        />


    <EditText
        android:id="@+id/termNameXML"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="textPersonName|textCapWords"
        />


    <Button
        android:id="@+id/startingDateButtonXML"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:onClick="reveal_StartingDate_DatePicker"
        />


    <Button
        android:id="@+id/endingDateButtonXML"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:onClick="reveal_EndingDate_DatePicker"
        />


    <Button
        android:id="@+id/saveButtonXML"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Save Changes and Return to the Main List"
        />


    <Button
        android:id="@+id/courseSelection_ButtonXML"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Choose Courses for This Term"
        />


</LinearLayout>

activity_term_courseselection.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.weslange.Term_Scheduling.Term_CourseSelection_Activity"
    >


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="\nChoose the Courses for This Term"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textStyle="bold"
        />


    <Button
        android:id="@+id/saveButtonXML"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Save Changes and Return to the Term Details"
        />


</LinearLayout>

再次感謝。

Mike M.在問題的評論中提供了答案,因此他應得到榮譽。 如果您覺得這有用,請給他投票。

缺少“ finish() ”會導致“ Term_ChangingDetails_Activity.java ”崩潰。 它應該看起來像這樣:

courseSelection_Button = findViewById( R.id.courseSelection_ButtonXML );
courseSelection_Button.setOnClickListener( new View.OnClickListener() {

    @Override
    public void onClick( View view ) {

        Intent intent = new Intent( Term_ChangingDetails_Activity.this, Term_CourseSelection_Activity.class );
        startActivity( intent );
        finish();

    }
});

盡管這樣可以防止崩潰,但是我不確定為什么“后退”按鈕失敗了。 將“ getSupportActionBar().setDisplayHomeAsUpEnabled( true ) ”添加到“ Term_CourseSelection_Activity.java ”的“ onCreate() ”方法中可以通過單擊“后退”按鈕來進行崩潰。

由於記憶力,我在最后一部分表示歉意。 我偶然發現了一種“后退”按鈕直接返回MainActivity的方法,即使Activity的父項不作為MainActivity存在。 我不記得細節了。 這樣做還避免了NullPointerException。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM