我在 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>
我在名为 UNItemListFragment.java 的类中动态填充两个 TextView 在 onCreate 方法中:
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);
}
}
对于每个号码,如果我点击我想调用电话的按钮 当用户点击按钮时调用 callNumber 方法:
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);
}
当我点击列表中的第一个按钮时是可以的,但是当我点击其他按钮时 它继续调用第一行中定义的号码...
知道如何解决这个问题吗?
最佳答案
问题是这一行:
TextView unItemVal = (TextView) findViewById(R.id.useful_nums_item_value);
在 Activity 上执行,因此 findViewById
将始终返回具有该 ID 的第一个项目,这可能是列表中的第一个项目。
解决此问题的最佳 方法是覆盖适配器并向 View 添加包含电话号码的标签。 快速解决此问题的方法是在 View 层次结构中进行标记,如下所示:
public void callNumber(View view) {
if( view != null ) { // view is the button tapped
View parent = view.getParent(); // this should be the LinearLayout
if( parent instanceof LinearLayout ) {
TextView unItemVal = (TextView) ((LinearLayout)parent).findViewById(R.id.useful_nums_item_value);
if( unItemVal != null ) {
Intent callIntent = new Intent(Intent.ACTION_CALL);
String phoneNumber = unItemVal.getText().toString();
callIntent.setData(Uri.parse("tel:" + phoneNumber));
startActivity(callIntent);
}
}
}
}
这会找到被单击按钮的父级,然后找到包含该 ViewGroup
中的数字的 TextView 。
关于java - 如何在 Android 中以编程方式调用电话?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23390602/