从Fragment ...No活动调用函数来处理错误

时间:2016-04-18 07:07:15

标签: android android-fragments android-intent

我看到很多与此相关的问题,但没有一个问题解决了我的问题,所以如果重复,我会道歉。

我正在创建一本联系簿。我创建了一个片段来显示所有联系人。 现在我想要做的是创建一个imageview(调用按钮),以便在单击时调用联系人。

我一直收到错误(没有找到活动来处理Intent {act android.intent.action.CALL},当我在我的设备上运行时它崩溃了,虽然我已经将清单添加到了清单中。 我做错了什么?

片段类:

public class DetailFragment extends Fragment
   implements LoaderManager.LoaderCallbacks<Cursor> {


public interface DetailFragmentListener {
  void onContactDeleted(); 
  void onEditContact(Uri contactUri);
  }

 private static final int CONTACT_LOADER = 0; 

 private DetailFragmentListener listener; // MainActivity

 private Uri contactUri; 

  private TextView nameTextView; 
 private TextView phoneTextView; 
 private TextView emailTextView; 
 private TextView streetTextView; 
 private TextView cityTextView; 
 private TextView stateTextView; 
 private TextView zipTextView; 
 private ImageButton callButton; //The image View for the calling 


 @Override
 public void onAttach(Context context) {
   super.onAttach(context);
   listener = (DetailFragmentListener) context;
 }


 @Override
 public void onDetach() {
  super.onDetach();
  listener = null;
 } 

 // called when DetailFragmentListener's view needs to be created
 @Override
 public View onCreateView(
       LayoutInflater inflater, ViewGroup container,
       Bundle savedInstanceState) {
  super.onCreateView(inflater, container, savedInstanceState);
  setHasOptionsMenu(true); // this fragment has menu items to display

  // get Bundle of arguments then extract the contact's Uri
  Bundle arguments = getArguments();

  if (arguments != null)
     contactUri = arguments.getParcelable(MainActivity.CONTACT_URI);

  // inflate DetailFragment's layout
  View view =
          inflater.inflate(R.layout.fragment_detail, container, false);

  // get the EditTexts
  nameTextView = (TextView) view.findViewById(R.id.nameTextView);
  phoneTextView = (TextView) view.findViewById(R.id.phoneTextView);
  emailTextView = (TextView) view.findViewById(R.id.emailTextView);
  streetTextView = (TextView) view.findViewById(R.id.streetTextView);
  cityTextView = (TextView) view.findViewById(R.id.cityTextView);
  stateTextView = (TextView) view.findViewById(R.id.stateTextView);
  zipTextView = (TextView) view.findViewById(R.id.zipTextView);
  callButton = (ImageButton) view.findViewById(R.id.callButton);/Get the image view

  // load the contact
  getLoaderManager().initLoader(CONTACT_LOADER, null, this);

  addListenerOnButton(view);//Call the Listener 
  return view;
  }

  // display this fragment's menu items
  @Override
  public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
  super.onCreateOptionsMenu(menu, inflater);
  inflater.inflate(R.menu.fragment_details_menu, menu);
   }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
  switch (item.getItemId()) {
     case R.id.action_edit:
        listener.onEditContact(contactUri); 
        return true;
     case R.id.action_delete:
        deleteContact();
        return true;
    }

    return super.onOptionsItemSelected(item);
 }


  private void deleteContact() {

  confirmDelete.show(getFragmentManager(), "confirm delete");
  }

  private final DialogFragment confirmDelete =
       new DialogFragment() {

          @Override
          public Dialog onCreateDialog(Bundle bundle) {

             AlertDialog.Builder builder =
                     new AlertDialog.Builder(getActivity());

             builder.setTitle(R.string.confirm_title);
             builder.setMessage(R.string.confirm_message);

             // provide an OK button that simply dismisses the dialog
             builder.setPositiveButton(R.string.button_delete,
                     new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(
                                DialogInterface dialog, int button) {


                           getActivity().getContentResolver().delete(
                                   contactUri, null, null);
                           listener.onContactDeleted(); // notify listener
                        }
                     }
             );

             builder.setNegativeButton(R.string.button_cancel, null);
             return builder.create(); // return the AlertDialog
          }
       };


  @Override
  public Loader<Cursor> onCreateLoader(int id, Bundle args) {

  CursorLoader cursorLoader;

  switch (id) {
     case CONTACT_LOADER:
        cursorLoader = new CursorLoader(getActivity(),
                contactUri, 
                null, 
                null, 
                null, 
                null); 
        break;
     default:
        cursorLoader = null;
        break;
  }

  return cursorLoader;
  }

    @Override
 public void onLoadFinished(Loader<Cursor> loader, Cursor data) {

  if (data != null && data.moveToFirst()) {
     // get the column index for each data item
     int nameIndex = data.getColumnIndex(Contact.COLUMN_NAME);
     int phoneIndex = data.getColumnIndex(Contact.COLUMN_PHONE);
     int emailIndex = data.getColumnIndex(Contact.COLUMN_EMAIL);
     int streetIndex = data.getColumnIndex(Contact.COLUMN_STREET);
     int cityIndex = data.getColumnIndex(Contact.COLUMN_CITY);
     int stateIndex = data.getColumnIndex(Contact.COLUMN_STATE);
     int zipIndex = data.getColumnIndex(Contact.COLUMN_ZIP);


     // fill TextViews with the retrieved data
     nameTextView.setText(data.getString(nameIndex));
     phoneTextView.setText(data.getString(phoneIndex));
     emailTextView.setText(data.getString(emailIndex));
     streetTextView.setText(data.getString(streetIndex));
     cityTextView.setText(data.getString(cityIndex));
     stateTextView.setText(data.getString(stateIndex));
     zipTextView.setText(data.getString(zipIndex));


  }
  }


 @Override
 public void onLoaderReset(Loader<Cursor> loader) {
 }
 /////Add listener to the image view
  public void addListenerOnButton(View v) {

  callButton.setOnClickListener(new View.OnClickListener() {

     @Override
     public void onClick(View arg0) {
        String phone_number = phoneTextView.getText().toString();//nUHA
        Intent callIntent =new Intent(Intent.ACTION_CALL);
        callIntent.setData(Uri.parse(phone_number));

        startActivity(callIntent);

      }

   });
 }
  }

这是on click方法的一部分

 @Override
     public void onClick(View arg0) {
        String phone_number = phoneTextView.getText().toString();//nUHA
        Intent callIntent =new Intent(Intent.ACTION_CALL);
        callIntent.setData(Uri.parse(phone_number));

        startActivity(callIntent);

我的主要

 public class MainActivity extends AppCompatActivity
 implements ContactsFragment.ContactsFragmentListener,
 DetailFragment.DetailFragmentListener,
 AddEditFragment.AddEditFragmentListener {


 public static final String CONTACT_URI = "contact_uri";

 private ContactsFragment contactsFragment; // displays contact list


  @Override
  protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
  setSupportActionBar(toolbar);

    if (savedInstanceState == null &&
     findViewById(R.id.fragmentContainer) != null) {
     // create ContactsFragment
     contactsFragment = new ContactsFragment();

     // add the fragment to the FrameLayout
     FragmentTransaction transaction =
        getSupportFragmentManager().beginTransaction();
     transaction.add(R.id.fragmentContainer, contactsFragment);
     transaction.commit(); // display ContactsFragment
     }
     else {
     contactsFragment =
        (ContactsFragment) getSupportFragmentManager().
           findFragmentById(R.id.contactsFragment);
     } 
      }

    @Override
    public void onContactSelected(Uri contactUri) {
    if (findViewById(R.id.fragmentContainer) != null) // phone
     displayContact(contactUri, R.id.fragmentContainer);
    else { // tablet

     getSupportFragmentManager().popBackStack();

     displayContact(contactUri, R.id.rightPaneContainer);
     }
     }


     @Override
     public void onAddContact() {
     if (findViewById(R.id.fragmentContainer) != null) // phone
     displayAddEditFragment(R.id.fragmentContainer, null);
     else // tablet
     displayAddEditFragment(R.id.rightPaneContainer, null);
      }


     private void displayContact(Uri contactUri, int viewID) {
      DetailFragment detailFragment = new DetailFragment();

    Bundle arguments = new Bundle();
    arguments.putParcelable(CONTACT_URI, contactUri);
    detailFragment.setArguments(arguments);


    FragmentTransaction transaction =
     getSupportFragmentManager().beginTransaction();
    transaction.replace(viewID, detailFragment);
    transaction.addToBackStack(null);
    transaction.commit(); // causes DetailFragment to display
     }


      private void displayAddEditFragment(int viewID, Uri contactUri) {
     AddEditFragment addEditFragment = new AddEditFragment();


     if (contactUri != null) {
     Bundle arguments = new Bundle();
     arguments.putParcelable(CONTACT_URI, contactUri);
      addEditFragment.setArguments(arguments);
     }


    FragmentTransaction transaction =
     getSupportFragmentManager().beginTransaction();
    transaction.replace(viewID, addEditFragment);
    transaction.addToBackStack(null);
   transaction.commit(); // causes AddEditFragment to display
     }


  @Override
   public void onContactDeleted() {
  // removes top of back stack
  getSupportFragmentManager().popBackStack();
  contactsFragment.updateContactList(); // refresh contacts
  }

  // display the AddEditFragment to edit an existing contact
  @Override
  public void onEditContact(Uri contactUri) {
  if (findViewById(R.id.fragmentContainer) != null) // phone
     displayAddEditFragment(R.id.fragmentContainer, contactUri);
  else // tablet
     displayAddEditFragment(R.id.rightPaneContainer, contactUri);
   }

  // update GUI after new contact or updated contact saved
  @Override
  public void onAddEditCompleted(Uri contactUri) {
  // removes top of back stack
  getSupportFragmentManager().popBackStack();
  contactsFragment.updateContactList(); // refresh contacts

  if (findViewById(R.id.fragmentContainer) == null) { // tablet
     // removes top of back stack
     getSupportFragmentManager().popBackStack();

     // on tablet, display contact that was just added or edited
     displayContact(contactUri, R.id.rightPaneContainer);
  }
   }
   }

我的清单          

   <uses-permission android:name="android.permission.CALL_PHONE"/>

  <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

        <intent-filter>
            <action android:name="android.intent.action.CALL"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>

    </activity>


    <provider
        android:name=".data.AddressBookContentProvider"
        android:authorities="com.deitel.addressbook.data"
        android:enabled="true"
        android:exported="false" >
    </provider>
</application>

</manifest>

1 个答案:

答案 0 :(得分:3)

使用

Uri.parse("tel:" + phone_number)

而不是

Uri.parse(phone_number)
相关问题