簡體   English   中英

按下按鈕后退出片段或活動

[英]Backing out of a fragment or activity when a button is pressed

我有一個聯系人列表,可將用戶帶到聯系人編輯屏幕。 我正在嘗試根據當前使用的內容來關閉編輯活動/片段(聯系人編輯)的操作。 因此,如果我使用的是片段,我希望它在從數據庫中保存或刪除后關閉片段,但是當我在小型設備上以縱向/橫向模式運行活動時,情況也是如此。 當我處於兩窗格模式時,我有以下代碼彈出一個錯誤(如我所料)。 基本上,我希望用戶查看聯系人列表,編輯聯系人,然后查看更新的聯系人列表(加上或減去他們的編輯)。

// Set the save button to check the required fields, save the contact and finish
saveButton.setOnClickListener(new View.OnClickListener() {
  public void onClick(View view) {
    if (TextUtils.isEmpty(mLastName.getText().toString()) ||
            TextUtils.isEmpty(mFirstName.getText().toString())) {
      makeToast();
    } else {   
        FragmentManager fragmentManager = getFragmentManager();
        fragmentManager.popBackStackImmediate();
        getActivity().finish();
   }
  }
});

// Set the delete button to delete the contact and close the fragment
deleteButton.setOnClickListener(new View.OnClickListener() {
    public void onClick(View view) {
        // Delete the contactUri created from an ID passed in from contactActivity
        getActivity().getContentResolver().delete(contactUri, null, null);

        FragmentManager fragmentManager = getFragmentManager();
        fragmentManager.popBackStackImmediate();
        getActivity().finish();
    }
  });  
return aView;

使用上面的代碼,我在contactEditFragment.onClick處獲得了​​NullPointerException

我想我需要一種區分活動和片段的方法。

05-05 05:40:57.200: E/AndroidRuntime(1350): FATAL EXCEPTION: main
05-05 05:40:57.200: E/AndroidRuntime(1350): java.lang.NullPointerException
05-05 05:40:57.200: E/AndroidRuntime(1350):     at com.somestuff.ContactEditFragment$1.onClick(ContactEditFragment.java:106)
05-05 05:40:57.200: E/AndroidRuntime(1350):     at android.view.View.performClick(View.java:4204)
05-05 05:40:57.200: E/AndroidRuntime(1350):     at android.view.View$PerformClick.run(View.java:17355)
05-05 05:40:57.200: E/AndroidRuntime(1350):     at android.os.Handler.handleCallback(Handler.java:725)
05-05 05:40:57.200: E/AndroidRuntime(1350):     at android.os.Handler.dispatchMessage(Handler.java:92)
05-05 05:40:57.200: E/AndroidRuntime(1350):     at android.os.Looper.loop(Looper.java:137)
05-05 05:40:57.200: E/AndroidRuntime(1350):     at android.app.ActivityThread.main(ActivityThread.java:5041)
05-05 05:40:57.200: E/AndroidRuntime(1350):     at java.lang.reflect.Method.invokeNative(Native Method)
05-05 05:40:57.200: E/AndroidRuntime(1350):     at java.lang.reflect.Method.invoke(Method.java:511)
05-05 05:40:57.200: E/AndroidRuntime(1350):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
05-05 05:40:57.200: E/AndroidRuntime(1350):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
05-05 05:40:57.200: E/AndroidRuntime(1350):     at dalvik.system.NativeStart.main(Native Method)

這是onContactSelected:

public void onContactSelected(String id) {
        if (mTwoPane)
        {
            Log.i("SECOND INSIDE OF ONITEMSELECTED TWO PANE MODE !!! IN CONTACTS ACTIVITY - THE ID IS:", id);
            // In two-pane mode, show the contact edit view in this activity by
            // adding or replacing the detail fragment using a
            // fragment transaction.

                // Create new fragment and transaction
                Bundle arguments = new Bundle();
                arguments.putString(ContactEditFragment.CONTACT_ID, id);
                ContactEditFragment contactEditFragment = new ContactEditFragment();
                contactEditFragment.setArguments(arguments);
                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

                // Replace whatever is in the fragment_container view with this fragment,
                // and add the transaction to the back stack
                transaction.replace(R.id.item_detail_container, contactEditFragment);
                transaction.addToBackStack(null);

                // Commit the transaction
                transaction.commit();

        } else {
            // In single-pane mode, simply start the detail activity
            // for the selected contact ID.
            Intent detailIntent = new Intent(this, ContactEditActivity.class);
            detailIntent.putExtra(ContactEditFragment.CONTACT_ID, id);
            startActivity(detailIntent);
                }

我已經嘗試了以下代碼,到目前為止,它可以按我期望的那樣工作:

   // Set the save button to check the required fields, save the contact and finish
        saveButton.setOnClickListener(new View.OnClickListener() {
          public void onClick(View view) {
            if (TextUtils.isEmpty(mLastName.getText().toString()) ||
                    TextUtils.isEmpty(mFirstName.getText().toString())) {
              makeToast();
            } else {  
                if (getActivity().findViewById(R.id.item_detail_container) != null){
                FragmentManager fragmentManager = getFragmentManager();
                fragmentManager.popBackStackImmediate();
                }
                else{getActivity().finish();}
           }
          }
        });

        // Set the delete button to delete the contact and close the fragment
    deleteButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            // Delete the contactUri created from an ID passed in from contactActivity
            getActivity().getContentResolver().delete(contactUri, null, null);

                if (getActivity().findViewById(R.id.item_detail_container) != null){
                FragmentManager fragmentManager = getFragmentManager();
                fragmentManager.popBackStackImmediate();
                }
                else{getActivity().finish();}
        }
      });  
    return aView;

暫無
暫無

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

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