Wie, um Anrufe programmgesteuert in Android?
Habe ich das folgende layout definiert useful_numbers_item_fragment.xml:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:id="@+id/call_linear_layout">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/useful_nums_item_name"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/useful_nums_item_value"/>
</LinearLayout>
<ImageButton
android:layout_width="0dp"
android:layout_height="wrap_content"
android:src="@drawable/call"
android:id="@+id/call_btn"
android:onClick="callNumber"/>
</LinearLayout>
Ich dynamisch füllen Sie die zwei text-Ansichten in einer Klasse genannt UNItemListFragment.java
in der onCreate-Methode:
public void onCreate(Bundle savedInstance) {
super.onCreate(savedInstance);
if (getArguments().containsKey(Constants.UNItem.GROUP_ID)) {
simpleCursorAdapter = new SimpleCursorAdapter(getActivity(), R.layout.useful_numbers_item_fragment, null,
new String[]{Constants.UNItem.NAME, Constants.UNItem.VALUE},
new int[]{R.id.useful_nums_item_name, R.id.useful_nums_item_value}, 0);
setListAdapter(simpleCursorAdapter);
getLoaderManager().initLoader(0, getArguments(), this);
}
}
Für jede Nummer, wenn ich auf den button möchte ich ein Anruf von
aufrufen callNumber Methode, wenn der Benutzer auf die Schaltfläche klickt:
public void callNumber(View view) {
Intent callIntent = new Intent(Intent.ACTION_CALL);
TextView unItemVal = (TextView) findViewById(R.id.useful_nums_item_value);
String phoneNumber = unItemVal.getText().toString();
callIntent.setData(Uri.parse("tel:" + phoneNumber));
startActivity(callIntent);
}
Es ist ok, wenn ich auf der ersten Schaltfläche in der Liste, aber wenn ich auf die anderen buttons
es ist weiterhin telefonisch unter der Nummer definiert, die in der ersten Reihe...
Eine Idee, wie man dieses Problem beheben?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass diese Zeile:
ausgeführt wird, auf die Aktivität, so dass die
findViewById
wird immer wieder das erste Element mit dieser id, das ist wahrscheinlich das erste Element in der Liste.Den besten Möglichkeit dieses Problem zu beheben wäre das überschreiben der adapter, und fügen Sie einen tag mit dem Telefon die Nummer der Ansicht. Ein schnell Möglichkeit dieses Problem zu beheben wäre, tag zusammen in der view-Hierarchie, etwa so:
Diese finden würde, die Eltern für die Schaltfläche, auf die geklickt wurde, und finden Sie dann die text-anzeigen mit der Anzahl innerhalb der
ViewGroup
.Mit
findViewById()
zurück ersten view in der activity oder fragment mit der angegebenen id. Wenn dies ist ein ListView, es entspricht der ersten Zeile.Es gibt viele Möglichkeiten, um dieses problem zu umgehen. Die Schnellste (aber sicherlich nicht der hübscheste, da kommt es auf das layout) zu verwenden
findViewById()
relativ zu dem LinearLayout enthält die Liste posten. Unter der Annahme, dassview
ist das ImageButton-Steuerelement, es wäre so etwas wie:Eine elegantere Lösung wäre, einen tag in der adapter s
getView()
mit den Daten, die Sie benötigen (in diesem Fall die Telefon-Nummer zu nennen).