1. 程式人生 > >用eclipse做的一個簡訊傳送器,編譯通過但是部署到模擬器上面出錯.後來經過多方學習發現是新的sdk原因

用eclipse做的一個簡訊傳送器,編譯通過但是部署到模擬器上面出錯.後來經過多方學習發現是新的sdk原因

這是我錯誤的MainActivity.java程式碼,因為佈局檔案不變,所以我就不貼出來了。

 package com.example.sms;

  import java.util.ArrayList;

  import android.support.v7.app.ActionBarActivity;
  import android.support.v4.app.Fragment;
  import android.telephony.SmsManager;
  import android.os.Bundle;
  import android.view.LayoutInflater;
  import android.view.Menu;
  import android.view.MenuItem;
  import android.view.View;
  import android.view.ViewGroup;
  import android.widget.Button;
  import android.widget.EditText;
  import android.widget.Toast;

  public class MainActivity extends ActionBarActivity {
  private EditText numberText;
  private EditText contentText;

      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          
          if (savedInstanceState == null) {
              getSupportFragmentManager().beginTransaction()
                      .add(R.id.container, new PlaceholderFragment())
                      .commit();
          }
          
          numberText=(EditText) this.findViewById(R.id.number);
          contentText=(EditText) this.findViewById(R.id.content);
          Button button=(Button)this.findViewById(R.id.button);
          button.setOnClickListener(new ButtonClickListener());
           
         
          
      }


      @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);
      }

      /**
       * A placeholder fragment containing a simple view.
       */
      public static class PlaceholderFragment extends Fragment {

          public PlaceholderFragment() {
          }

          @Override
          public View onCreateView(LayoutInflater inflater, ViewGroup container,
                  Bundle savedInstanceState) {
              View rootView = inflater.inflate(R.layout.fragment_main, container, false);
              return rootView;
          }
      }
      
      private final class ButtonClickListener implements View.OnClickListener{

  @Override
  public void onClick(View v) {


  String number=numberText.getText().toString();
  String content=contentText.getText().toString();

  SmsManager manager=SmsManager.getDefault();
  ArrayList<String> texts=manager.divideMessage(content);
  for(String text:texts)
  {
  manager.sendTextMessage(number, null,text, null, null);
  }
  Toast.makeText(getApplicationContext(), R.string.success, Toast.LENGTH_LONG).show();; 
  }
       
      }

  }

錯誤資訊指向 onCreate裡面的  button.setOnClickListener(new ButtonClickListener());

顯示它為空指標,本來我想明明傳過去了,後來百度才知道現在都在 PlaceholderFragment 裡面的onCreateView方法裡面進行查詢id以及設定按鈕的各種事件。於是將onCreate裡面的所有操作刪除,不去動它,然後在onCreateView裡面進行操作就可以了,還有就是findViewById,應該是使用rootView.findViewById而不是this.findViewById.

需要注意的就是在Toast通知語句後面記得加入show(),那麼你的通知才會被顯示,另外你要在安卓清單檔案(AndroidManifest.xml)中加入  <uses-permission  android:name="android.permission.SEND_SMS"/>才能獲取傳送簡訊的許可權。

下面是我修改後的MainActivity.java程式碼,貼出來。

package com.example.sms;
 
import java.util.ArrayList;
 
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.telephony.SmsManager;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import android.os.Build;
 
public class MainActivity extends ActionBarActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment())
                    .commit();
        }
    }
 
 
    @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);
    }
 
    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {
 
        public PlaceholderFragment() {
        }
 
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container, false);
             
            final EditText numberText=(EditText) rootView.findViewById(R.id.number);
            final EditText contentText=(EditText) rootView.findViewById(R.id.content);
            Button button=(Button) rootView.findViewById(R.id.button);
             
            button.setOnClickListener(new View.OnClickListener() {
                 
                @Override
                public void onClick(View v) {
                      String number=numberText.getText().toString();
                      String content=contentText.getText().toString();
 
                      SmsManager manager=SmsManager.getDefault();
                      ArrayList<String> texts=manager.divideMessage(content);
                      for(String text:texts)
                      {
                      manager.sendTextMessage(number, null,text, null, null);
                      }
                      Toast.makeText(getActivity(),R.string.success,Toast.LENGTH_LONG).show();
                }
            });
            return rootView;
        }
    }
}

這是我在學習傳智播客安卓開發黎活明視訊中的簡訊傳送器期間遇到的問題,我們不能照搬視訊上面的程式碼,因為sdk更新了,所以很多操作會不一樣。希望這篇簡單的部落格能對和我一樣的安卓初學者有幫助。