2014-04-30 86 views
2

enter image description here如何在Android中以編程方式撥打電話?

我在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> 

我動態填充在一個在onCreate方法稱爲UNItemListFragment.java 類兩個文本的觀點:

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

當我點擊第一個按鈕,在列表中,但是當我點擊其他按鈕 繼續調用第一行中定義的數量是確定...

任何想法如何解決這個問題?

回答

9

的問題是,這條線:

TextView unItemVal = (TextView) findViewById(R.id.useful_nums_item_value); 

是在活動執行,所以findViewById將始終與ID,它很可能在列表中的第一項返回的第一個項目。

best解決這個問題的方法是覆蓋適配器並將包含電話號碼的標籤添加到視圖中。解決這個問題一個快速方式是在視圖層次沿着標記,像這樣:

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之內。

0

使用findViewById()將返回第一個視圖中具有指定id的活動或片段。如果這是一個ListView,它將對應於第一行。

有很多方法可以解決此問題。最快的一個(但肯定不是最漂亮的一個,因爲它取決於佈局)將相對於包含列表項目的LinearLayout使用findViewById()。假設view是ImageButton的,它會不會停,如:

((View)view.getParent()).findViewById(R.id.useful_nums_item_value) 

更好的解決方案是設置在適配器的getView()標籤,包含需要(在這種情況下,數據,電話號碼打電話)。

相關問題