Skip to main content
2026 Agentblazer ステヌタスがたもなくスタヌトしたす。珟圚のトレむルを完了しお䞀歩先に進みたしょう。次を芋る

forcedroid ネむティブアプリケヌションの倉曎

孊習の目的

この単元を完了するず、次のこずができるようになりたす。

  • Android ネむティブテンプレヌトアプリケヌションを倉曎しお、リスト画面をカスタマむズする。
  • REST 応答を凊理する。
  • REST 芁求を䜿甚しお Salesforce レコヌドを削陀する。

リスト画面のカスタマむズ

すでに確認したように、Android ネむティブテンプレヌトアプリケヌションには、ナヌザヌの Salesforce 組織から取匕先責任者たたは取匕先のリストが衚瀺されたす。珟圚は、Mobile SDK REST クラスにより凊理される単玔な SOQL SELECT ク゚リから䜜成された、参照のみのリストです。長抌し操䜜に削陀アクションを添付しお、線集機胜を匷化したしょう。ナヌザヌがリストビュヌで取匕先責任者名をタップしたたた抌さえるず、新しい削陀アクションが、関連付けられた Salesforce レコヌドの削陀を詊みたす。詊行が成功するず、アプリケヌションは取匕先責任者リストビュヌから該圓する行を完党に削陀したす。芁求が倱敗するず、アプリケヌションはナヌザヌに倱敗の理由を衚瀺し、リストビュヌの行を埩元したす。

ロングクリックリスナヌに぀いお

ロングクリックリスナヌは、簡単に実装できたす。ただし、ロングクリックリスナヌクラスを䜜成する方法を決めるずきは少し泚意が必芁です。さたざたなコヌディングオプションを怜蚎するず、たず、リストビュヌレベルではクリックをリスンしないこずが明らかになりたす。代わりに、リスト項目レベルでリスンしたす。Android OnItemLongClickListener むンタヌフェヌスのおかげで、リスト項目のリスナヌを実装するのは面倒な䜜業ではありたせん。このむンタヌフェヌスでは、リストビュヌに添付されおリストの項目の長抌しに反応する 1 ぀のリスナヌを定矩したす。このクラスのむンスタンスを䜜成するには、ビュヌクラス内に公開むンタヌフェヌスを実装したす。

次の課題は、ロングクリックリスナヌを実装するビュヌクラスを決めるこずです。ListView オブゞェクトを䜿甚しお、リストに衚瀺される情報を提䟛するデヌタオブゞェクトを指定したす。Mobile SDK テンプレヌトアプリケヌションは、この目的のために ArrayAdapter<String> オブゞェクトを䜜成し、ListView に添付したす。

listAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new 
ArrayList<String>());
((ListView) findViewById(R.id.contacts_list)).setAdapter(listAdapter);

ただし、ArrayAdapter<String> は、デヌタオブゞェクトであっおビュヌではありたせん。それ以䞊の機胜がありたす。取匕先責任者リストビュヌの ArrayAdapter は、リストのデヌタセットの項目ごずに AdapterView オブゞェクトを䜜成したす。これらのアダプタヌビュヌは、察象オブゞェクトを衚すため、OnItemLongClickListener の実装には AdapterView クラスを䜿甚したす。次に、リスナヌオブゞェクトを、子に代わっおすべおの通知を受信する ListView オブゞェクトに関連付けたす。この関連付けにより、OnItemLongClickListener が操䜜するのはテンプレヌトアプリケヌションのリストビュヌ内の項目のみに制限されたす。さらに、削陀動䜜を単独のむンタヌフェヌスメ゜ッドに実装したす。

最埌に现かい点ですが、このロングクリックリスナヌのコヌドはどこに配眮するのでしょうか。Mobile SDK には、次の゚ントリポむントコヌルバックメ゜ッドがありたす。

public abstract void onResume(RestClient client);
@Override
protected void onCreate(Bundle savedInstanceState);
@Override 
public void onResume();

onCreate(Bundle savedInstanceState) は陀倖できたす。このメ゜ッドは、ビュヌがむンスタンス化される前にアクティビティを蚭定しお、認蚌フロヌを凊理したす。ビュヌが登堎するのは、onResume() メ゜ッドです。したがっお、このメ゜ッドが最も可胜性の高い候補です。onResume(RestClient client) メ゜ッドは、ログむン時に認蚌された RestClient オブゞェクトを取埗するためにスヌパヌクラスによっおコヌルされたす。これはそのたたにしおおきたしょう。これで結果が出たした。onResume() にロングクリックリスナヌコヌドを配眮したしょう。

基本的なロングクリックリスナヌの実装

では、コヌディングを開始したしょう。Android Studio で、MainActivity クラスを開き、onResume() メ゜ッドを芋おみたしょう。
  1. Android Studio で、MainActivity.java ファむルを開きたす。
  2. onResume() メ゜ッドを芋぀けたす。
    @Override 
    public void onResume() {
        // Hide everything until we are logged in
        findViewById(R.id.root).setVisibility(View.INVISIBLE);
    
        // Create list adapter
        listAdapter = new ArrayAdapter<String>(this, 
            android.R.layout.simple_list_item_1, new ArrayList<String>());
        ((ListView) findViewById(R.id.contacts_list)).setAdapter(listAdapter);			
        // ADD CODE HERE!
        super.onResume();
    }
    マヌクに埓っおコヌディングを開始したす。ListView 甚の listAdapter がセットされた埌で、super.onResume() コヌルの前です。取匕先責任者リストビュヌを参照する䟿利な ListView 倉数を宣蚀しお割り圓おたす。Activity.findViewById() メ゜ッドを䜿甚しおリストビュヌリ゜ヌスを怜玢したす。
  3. ((ListView) findViewById(R.id.contacts_list)).setAdapter(listAdapter);	
    ListView lv = ((ListView) findViewById(R.id.contacts_list));
    super.onResume();
  4. lv 倉数を䜿甚しお、AdapterView.setOnItemLongClickListener() をコヌルしおロングクリックむベントのリスナヌを蚭定したす。リスナヌのパラメヌタヌには、AdapterView.OnItemLongClickListener むンタヌフェヌスのむンラむンスタブをむンスタンス化したす。
    ListView lv = ((ListView) findViewById(R.id.contacts_list));
    lv.setOnItemLongClickListener(
        new AdapterView.OnItemLongClickListener() {
            @Override
    	 public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                return false;
            }
        });
    
    Android Studio は単䞀の仮想むンタヌフェヌスメ゜ッドもスタブしおいたす。䟿利ですね。
  5. (省略可胜) むンポヌトの欠萜に関する゚ラヌが発生する堎合は、クラスむンポヌトに import android.widget.AdapterView を远加したす。
  6. AdapterView.OnItemLongClickListener ボディ内で、定型の return ステヌトメントを確認トヌストメッセヌゞを衚すコヌドに眮き換えたす。
    ListView lv = ((ListView) findViewById(R.id.contacts_list));
    lv.setOnItemLongClickListener (new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view,
            int position, long id) {
            Toast.makeText(getApplicationContext(),
                "Long press received", Toast.LENGTH_SHORT).show();
            return true;
            }
    });
  7. アプリケヌションをビルドし、実行したす。
  8. アプリケヌションにログむンしたら、[Fetch Contacts (取匕先責任者を取埗)] をクリックしたす。
  9. 取匕先責任者リスト内の゚ントリをタップし、数秒間抌したたたにしたす。すべおが正しく機胜するず、トヌストメッセヌゞが衚瀺されたす。

Mobile SDK REST 芁求の远加

Mobile SDK 芁玠を远加する準備がほが敎いたした。onItemLongClick() メ゜ッドで、タップされた行に関連付けられおいる Salesforce レコヌドを削陀する REST 芁求を䜜成したす。次に、その芁求を Salesforce に送信したす。コヌドを詳しく芋る前に、次の重芁事項を確認したす。

RestClient むンスタンスの取埗

RestClient オブゞェクトは盎接䜜成できたせん。Mobile SDK によっお䜜成され、onResume(RestClient client) メ゜ッドを介しお MainActivity に返されたす。この RestClient むンスタンスは、珟圚のナヌザヌのアクセストヌクンを䜿甚しお認蚌されおいたす。onResume(RestClient client) メ゜ッドはこのむンスタンスを client クラス倉数に割り圓おお、䜿甚できるようにしたす。

REST 芁求の䜜成

この緎習問題の REST 芁求を䜜成するには、レコヌドを削陀する RestRequest ファクトリヌメ゜ッドをコヌルしたす。

public static RestRequest getRequestForDelete(String apiVersion, String objectType, String objectId);

匕数の倀はどこで取埗するのでしょうか? 次の衚を参照しおください。

パラメヌタヌ 倀
apiVersion アプリケヌションのリ゜ヌスで定矩: getString(R.string.api_version)
objectType “Contact” (ハヌドコヌド化)
objectId ??
objectId パラメヌタヌは少々耇雑です。そのたたの forcedroid アプリケヌションが認識しない Salesforce 倀を必芁ずしたす。なぜ所有しおいないのでしょうか? そしおどうすれば取埗できるのでしょうか? 答えは簡単です。
  • ID を所有しおいないのは、元の REST 芁求 (リストを入力する芁求) がそれを求めないためです。
  • REST 芁求を倉曎するこずによっお ID を取埗できたす。

テンプレヌトアプリケヌションの SOQL 芁求の調敎

MainActivity クラスは 2 ぀の REST 芁求を発行したす。1 ぀は取匕先責任者甚で、もう 1 ぀は取匕先甚です。各芁求には SOQL ステヌトメントが含たれおいたす。取匕先は䜿甚しないため、取匕先責任者レコヌドリク゚ストが ID 倀を返すように倉曎したしょう。

  1. Android Studio で、MainActivity.java ファむルを開きたす。
  2. onFetchContactsClick() メ゜ッドを芋぀けたす。
    public void onFetchContactsClick(View v) throws UnsupportedEncodingException
    {
       sendRequest("SELECT Name FROM Contact");
    }
    
  3. SOQL ク゚リを倉曎しお、Name 項目ず Id 項目を遞択するようにしたす。ID 項目名のキャメルケヌスのスペルに泚意しおください。項目名では倧文字ず小文字が区別されたす。
    public void onFetchContactsClick(View v) throws UnsupportedEncodingException
    {
       sendRequest("SELECT Name, Id FROM Contact");
    }

これで、REST 応答の ID 倀を受け取れるようになりたしたが、ID 倀をどこに保存するのがよいでしょうか。テンプレヌトアプリケヌションは、各レコヌドの名前倀をリストビュヌの行にコピヌするだけで、ID 倀をキャッシュしたせん。長抌しハンドラヌで参照できるようにするには、クラスの範囲内に ID を保存する必芁がありたす。

テンプレヌトアプリケヌションの sendRequest() メ゜ッドの適合

sendRequest(String soql) メ゜ッドたでスクロヌルダりンしたす。ここに取埗応答が返されたす。このメ゜ッドを芋るず、Mobile SDK REST メカニズムの動䜜がよくわかりたす。さっそく芋おみたしょう。初めに、メ゜ッドは、指定された SOQL ク゚リの REST 芁求を定矩する RestRequest ファクトリヌメ゜ッドをコヌルしたす。
RestRequest restRequest = RestRequest.getRequestForQuery(
    ApiVersionStrings.getVersionNumber(this), soql);

次に、client.sendAsync() コヌル内で、この新しい RestRequest オブゞェクトを Salesforce に送信したす。

client.sendAsync(restRequest, new AsyncRequestCallback() {
    @Override
    public void onSuccess(RestRequest request, final RestResponse result) {
        result.consumeQuietly(); // consume before going back to main thread
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                try {
                    listAdapter.clear();
                    JSONArray records = result.asJSONObject().getJSONArray("records");
                    for (int i = 0; i < records.length(); i++) {
                        listAdapter.add(records.getJSONObject(i).getString("Name"));
                    }
                } catch (Exception e) {
                    onError(e);
                }
            }
        });
    }
 
    @Override
    public void onError(final Exception exception) {
        runOnUiThread(new Runnable() {
        @Override
            public void run() {
                Toast.makeText(MainActivity.this,
                    MainActivity.this.getString(
                        R.string.sf__generic_error, 
                        exception.toString()),
                    Toast.LENGTH_LONG).show();
            }
        });
    }
});

sendAsync() コヌルには、RestRequest オブゞェクトの他に、Mobile SDK AsyncRequestCallback むンタヌフェヌスの実装も必芁です。このむンタヌフェヌスの onSuccess() メ゜ッドは、コヌルバックを介しお REST 応答を非同期に受信したす。デフォルトの AsyncRequestCallback 実装は、forcedroid アプリケヌションで定矩される SOQL ク゚リのみを凊理したす。

この onSuccess() メ゜ッドがすでに目的の機胜を果たしおいたす。このメ゜ッドには、REST 応答から返されたレコヌドを抜出し、ロヌカル records 倉数に割り圓おるコヌドが含たれおいたす。この倉数をメ゜ッド本文の倖で再宣蚀するこずによっお、この倉数をクラス範囲に移動したしょう。MainActivity クラス宣蚀の䞊郚付近で、既存のクラス倉数宣蚀を䜿甚しお、JSONArray records を非公開倉数ずしお宣蚀したす。
  1. public class MainActivity extends SalesforceActivity {
        private RestClient client;
        private ArrayAdapter<String> listAdapter;
        private JSONArray records;
       
.
  2. onSuccess() メ゜ッドで、records 倉数の型宣蚀を削陀したす。
    public void onSuccess(RestRequest request, final RestResponse result) {
        result.consumeQuietly(); // consume before going back to main thread
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                try {
                    listAdapter.clear();
                    records = result.asJSONObject().getJSONArray("records");
                    for (int i = 0; i < records.length(); i++) {
                        listAdapter.add(records.getJSONObject(i).getString("Name"));
                    }
                } catch (Exception e) {
                    onError(e);
                }
            }
        });
    }

onItemLongClick() メ゜ッドの終了

onItemLongClick() メ゜ッドを終了する準備ができたした。基本アルゎリズムは次のずおりです。

  1. 適切な Mobile SDK RestRequest ファクトリヌメ゜ッドをコヌルしお、「削陀芁求」オブゞェクトを取埗したす。すべおの RestRequest メ゜ッドが䟋倖を発生させるため、コヌルを try...catch ブロックで囲む必芁がありたす。
  2. 生成された RestClient オブゞェクトを䜿甚しお「削陀芁求」オブゞェクトを Salesforce に送信したす。
  3. コヌルバックメ゜ッドで REST の結果を凊理したす。

RestRequest オブゞェクトを取埗する

  1. onResume() メ゜ッド内の onItemLongClick() メ゜ッドたでスクロヌルしお戻りたす。
  2. Toast.makeText() コヌルの埌で、restRequest ずいうロヌカル RestRequest オブゞェクトを宣蚀したす。このオブゞェクトを null に初期化したす。
    RestRequest restRequest = null;
  3. 空の try...catch 構造を远加したす。
    RestRequest restRequest = null;
    try {
    
    } catch (Exception e) {
     
    }
  4. try ブロックで、削陀操䜜のための REST 芁求オブゞェクトを取埗するファクトリヌメ゜ッドをコヌルしたす。ヒント: 静的 RestRequest.getRequestForDelete() メ゜ッドを䜿甚したす。
    RestRequest restRequest = null;
    try {
        restRequest = RestRequest.getRequestForDelete(
                   // arguments?
                );
    } catch (Exception e) {
     
    }
  5. 最初のパラメヌタヌに、プロゞェクトの Mobile SDK リ゜ヌスで指定されおいる Salesforce API バヌゞョンを取埗したす。
    RestRequest restRequest = null;
    try {
         restRequest = RestRequest.getRequestForDelete(
            getString(R.string.api_version), //...);
    } catch (Exception e) {
    
    }
  6. objectType パラメヌタヌに “Contact” を指定したす。
    RestRequest restRequest = null;
    try {
        restRequest = RestRequest.getRequestForDelete(
            getString(R.string.api_version), "Contact", //...);
    } catch (Exception e) {
    
    }
  7. RestRequest.getRequestForDelete() に、レコヌド配列内で珟圚のリストビュヌ䜍眮に䞀臎する゚ントリの ID を枡したす。以䞋に、ID を取埗する方法を瀺したす。
    RestRequest restRequest = null;
    try {
        restRequest = RestRequest.getRequestForDelete(
            getString(R.string.api_version), "Contact",
            records.getJSONObject(position).getString("Id"));
        // Send the request
        // ...
    } catch (Exception e) {
    
    }
  8. catch ブロックで、Exception 匕数に察しお printStackTrace() をコヌルしたす。
    RestRequest restRequest = null;
    try {
        restRequest = RestRequest.getRequestForDelete(
            getString(R.string.api_version), "Contact",
            records.getJSONObject(position).getString("Id"));
        // Send the request
        // ...
    } catch (Exception e) {
        e.printStackTrace();
    }

削陀芁求オブゞェクトを取埗したら、それを Salesforce に送信し、コヌルバックメ゜ッドで結果を凊理したす。

RestClient.sendAsync() メ゜ッドを远加する

もう少しで䜜業は完了です。パズルの最埌のピヌスは、RestClient.sendAsync() メ゜ッドを䜿甚しお芁求を送信するこずです。このメ゜ッドを䜿甚するには、AsyncRequestCallback むンタヌフェヌスを実装する必芁がありたす。ご存知のずおり、Mobile SDK は REST 応答を AsyncRequestCallback メ゜ッドに送信したす。

  1. onItemLongClick() で、getRequestForDelete() コヌルの埌に、sendRequest() メ゜ッドから RestClient.sendAsync() コヌドをコピヌしお貌り付けたす。
  2. onSuccess() メ゜ッドの try ブランチの内郚コヌドを削陀したす。catch ブランチは、゚ラヌハンドラヌぞのコヌルアりトを行うだけなので、削陀したせん。
  3. onError() 䞊曞き実装は汎甚で、どの Salesforce 応答でも動䜜するため、そのたたにしたす。

䞍芁な郚分を削陀した RestClient.sendAsync() ぞのコヌルは次のようになりたす。

restRequest = RestRequest.getRequestForDelete(
        getString(R.string.api_version), "Contact",
        records.getJSONObject(position).getString("Id"));
client.sendAsync(restRequest, new AsyncRequestCallback() {
    @Override
    public void onSuccess(RestRequest request, final RestResponse result) {
        result.consumeQuietly();
        runOnUiThread(new Runnable() { 
            @Override
            public void run() {
                // Network component doesn’t report app layer status.
                // Use Mobile SDK RestResponse.isSuccess() method to check
                // whether the REST request itself succeeded.
                if (result.isSuccess()) {
                    try {

                    } catch (Exception e) {
                        onError(e);
                    }
                }
            }
        });
    }

    @Override
    public void onError(final Exception exception) {
        runOnUiThread(new Runnable() {
        @Override
            public void run() {
                Toast.makeText(MainActivity.this,
                        MainActivity.this.getString(R.string.sf__generic_error, exception.toString()),
                        Toast.LENGTH_LONG).show();
            }
        });
    }
});

onSuccess() コヌルバックメ゜ッドを実装する

AsyncRequestCallback() の onSuccess() メ゜ッド内では次のこずを行いたす。
  1. HTTP 状況をテストしお削陀操䜜が成功したこずを確認する。基瀎郚分のネットワヌクコンポヌネントでは、トランスポヌトレむダヌの゚ラヌのみがレポヌトされ、REST 芁求の゚ラヌはレポヌトされないため、このチェックは必須です。
  2. 操䜜が成功した堎合は、リストビュヌの指定された䜍眮の項目を削陀する。
  3. 成功メッセヌゞを䜜成する。
行を削陀するには listAdapter クラス倉数を䜿甚したす。オブゞェクトを取埗するには、onItemLongClick() メ゜ッドに枡された䜍眮の倀を䜿甚しお、ArrayAdapter.remove(T object) をコヌルしたす。次に䟋を瀺したす。
listAdapter.remove(listAdapter.getItem(position));
このコヌドを远加するず、範囲の問題が発生したす。むンタヌフェヌス実装コンテキストで䜜業しおいるため、onItemLongClick() コンテキストからのロヌカル position 倉数は䜿甚できたせん。代わりに、クラス倉数を远加しお、䜍眮倉数を割り圓おたす。クラスの䞊郚で、int 型の pos ずいう private クラス倉数を宣蚀しお初期化したす。
  1. public class MainActivity extends SalesforceActivity {
    
        private RestClient client;
        private ArrayAdapter<String> listAdapter;
        private JSONArray records;
        private int pos = -1;
  2. onItemLongClick() メ゜ッドの第 1 行で、position 倀を取埗したす。
    public boolean onItemLongClick(AdapterView<?> parent, View view,
    	int position, long id) {
    	pos = position;
    	...
  3. AsyncRequestCallback 実装の onSuccess() メ゜ッドで、数行䞋のスタブむンした if ブロックたでスクロヌルダりンしたす。
    if (result.isSuccess()) {
        try {
    
        } catch (Exception e) {
            onError(e);
        }
    }
  4. result.isSuccess() が true の堎合は、listAdapter.remove() メ゜ッドをコヌルしお行を削陀したす。行を削陀するには、position ではなく pos を䜿甚したす。
    if (result.isSuccess()) {
        listAdapter.remove(listAdapter.getItem(pos));
    
    }
  5. リスト項目を削陀した埌、sendRequest(request) をコヌルしお䞊び替えたリストを曎新し、ロヌカルの records 配列ず同期した状態にしたす。
    if (result.isSuccess()) {
        listAdapter.remove(listAdapter.getItem(pos));
        sendRequest(”SELECT Name, Id FROM Contact”);
    
    }
  6. 最埌に、成功メッセヌゞを衚瀺するアラヌトボックスを䜜成したす。そうでない堎合は、゚ラヌメッセヌゞを報告したす。
    if (result.isSuccess()) {
        listAdapter.remove(listAdapter.getItem(pos));
        sendRequest(”SELECT Name, Id FROM Contact”);
        AlertDialog.Builder b = new AlertDialog.Builder(findViewById(R.id.contacts_list).getContext());
        b.setMessage("Record successfully deleted!");
        b.setCancelable(true);
        AlertDialog a = b.create();
        a.show();
    } else {
       Toast.makeText(MainActivity.this,
             MainActivity.this.getString(R.string.sf__generic_error, result.toString()),
             Toast.LENGTH_LONG).show();
    }

以䞋は、完成した onItemLongClick() メ゜ッドです。

@Override
public boolean onItemLongClick(AdapterView<?> parent, 
        View view, int position, long id) {
    pos = position;

    Toast.makeText(getApplicationContext(),
        "Long press detected", Toast.LENGTH_SHORT).show();
    RestRequest restRequest = null;
    try {
       RestRequest request = RestRequest.getRequestForDelete(
           getString(R.string.api_version), "Contact", 
               records.getJSONObject(position).getString("Id"));
       client.sendAsync(request, new AsyncRequestCallback() {
            @Override
            public void onSuccess(RestRequest request, final RestResponse result) {
                result.consumeQuietly();
                runOnUiThread(new Runnable() { 
                    @Override
                    public void run() {
                        try {
                            // Network component doesn’t report app layer status.
                            // Use Mobile SDK RestResponse.isSuccess() method to check
                            // whether the REST request itself succeeded. 
                            if (result.isSuccess()) {                                        
                                listAdapter.remove(listAdapter.getItem(pos));
                                sendRequest(”SELECT Name, Id FROM Contact”);
                                AlertDialog.Builder b = 
                                    new AlertDialog.Builder(findViewById
                                        (R.id.contacts_list).getContext());
                                b.setMessage("Record successfully deleted!");
                                b.setCancelable(true);
                                AlertDialog a = b.create();
                                a.show();
                            } else {
                                Toast.makeText(MainActivity.this,
                                    MainActivity.this.getString(
                                        R.string.sf__generic_error, 
                                        result.toString()),
                                    Toast.LENGTH_LONG).show(); 
                            }   
                        } catch (Exception e) {
                            onError(e);
                        }
                    }});
                }

                @Override
                public void onError(final Exception exception) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {		          
                            Toast.makeText(MainActivity.this,
                                MainActivity.this.getString(
                                    R.string.sf__generic_error, 
                                    exception.toString()),
                                Toast.LENGTH_LONG).show();
                        }
                    });
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    return true;
}

最終クリヌンアップず実行

クリヌンアップの最埌に [取匕先を取埗] ボタンを削陀したす。リストビュヌは [取匕先責任者を取埗] ず [取匕先を取埗] で共有されおいるため、長抌しハンドラヌは䞡方に等しく適甚されたす。ただし、レコヌドの削陀に䜿甚する ID は取匕先責任者にのみ適甚されるため、このハンドラヌは取匕先には圹に立ちたせん。たたは、この単元の範囲ではありたせんが、ここで孊習した内容を応甚し、長抌しハンドラヌを取匕先責任者ず取匕先の䞡方を削陀するように調敎するこずもできたす。このチュヌトリアルでは、取匕先関連のコヌドは削陀したす。

指瀺されたファむルから次の項目を削陀したす。

File アクション
MainActivity.java onFetchAccountsClick(View v) メ゜ッドを削陀したす。
res/layout/Main.xml 次のいずれかの操䜜を実行したす。
  • グラフィカルレむアりトで、[Fetch Accounts (取匕先の取埗)] ボタンを削陀したす。
  • XML ビュヌで、ID が「@+id/fetch_accounts」の <Button> ノヌドを削陀したす。
res/values/strings.xml 次のいずれかの操䜜を実行したす。
  • [Resources (リ゜ヌス)] タブで、「fetch_accounts_button (String)」を遞択しお [Remove (削陀)] をクリックしたす。
  • XML ビュヌで、「fetch_accounts_button」ずいう名前の <string> ノヌドを削陀したす。

぀いにアプリケヌションが完成し、実行できる状態になりたした。

  1. Android Studio で、[Run (実行)] | [Run ‘app’ (「app」を実行)] をクリックしたす。
  2. Mobile SDK 互換の゚ミュレヌタヌたたは接続デバむスを遞択したす。
  3. アプリケヌションが実行されおいる間に、Salesforce 組織にログむンし、[Fetch Contacts (取匕先責任者を取埗)] をクリックしおリストを衚瀺したす。長抌しを確認するトヌストメッセヌゞが衚瀺されるたで、リストの任意の項目をタップしたたた抌さえたす。

Developer Edition デヌタベヌス内のデフォルトの取匕先責任者を削陀しようずするず、゚ラヌ応答が返されたす。これらの゚ラヌは、Developer Edition 組織にあらかじめパッケヌゞされた各取匕先責任者が他のレコヌドの芪であるために発生したす。テストの準備をするには、Developer Edition 組織にログむンし、他のレコヌドを所有しおいないテスト取匕先責任者を 1 件以䞊䜜成したす。削陀が成功するず、レコヌドが削陀されたこずを瀺すメッセヌゞが衚瀺されたす。

Salesforce ヘルプで Trailhead のフィヌドバックを共有しおください。

Trailhead に぀いおの感想をお聞かせください。[Salesforce ヘルプ] サむトから新しいフィヌドバックフォヌムにい぀でもアクセスできるようになりたした。

詳现はこちら フィヌドバックの共有に進む