2011-09-06 21 views
2

我有一個超級TestUI應用程序。它有一個帶有按鈕的gridview。將Button onClick傳遞迴主要活動的最佳方法是什麼?

我想單擊按鈕點擊回傳到主Activity,以便它可以更新其狀態。

不幸的是,按鈕竊取點擊。所以典型的:

 gridview.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 
       Toast.makeText(TestUI.this, "" + position, Toast.LENGTH_SHORT).show(); 
      } 
     }); 

不會被調用。

而是在適配器定義:

public View getView(int position, View convertView, ViewGroup parent) { 

    Button gridItem; 

    if (convertView == null) { // if it's not recycled, initialize some attributes 
     gridItem = new Button(mContext); 
    } else { 
     gridItem = (Button) convertView; 
    } 
    gridItem.setText("button " + String.valueOf(position)); 
    gridItem.setClickable(true); 
    gridItem.setFocusable(false); 
    gridItem.setOnClickListener(new MyOnClickListener(position, mContext)); 

    return gridItem; 

這是支持的一類MyOnClickListener實現了OnClickListener接口。但是,如果我這樣做,我仍然需要回調主要活動,但它需要知道在控制程序狀態時執行了某些操作。

那麼從點擊按鈕更新「根」類/活動狀態的最好方法是什麼?

我知道這是一個基本的面向對象問題,但我主要是在ASM和C中編寫的,所以我坦率地只是不知道。

回答

0

正如你所說,你的getView方法在適配器類中。但是適配器會獲取getView方法可以訪問的「上下文」的副本。上下文是所有活動和服務的超級類別。通過這個對象,你可以完成Activity的許多基本操作。從你的例子中,我明白你想表示敬酒。這可以通過使用

public View getView(int position, View convertView, ViewGroup parent) { 
    //usual getView stuff goes first 

    gridItem.setOnClickListener(new OnClickListener(){ 
     public onClick(View v){ 
      Toast.makeText(mContext, "" + position, Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 

因此,在短期,你MyOnClickListener類需要使用的mContext變量與根系活力交互來完成。

編輯 我意識到我在上面的答案中犯了一個錯誤。我查看了http://developer.android.com/resources/tutorials/views/hello-gridview.html上的示例,並意識到您並不侷限於使用上下文。你可以使用像

public class MyActivity extends Activity { 
    public int a = 0; 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     GridView gridview = (GridView) findViewById(R.id.gridview); 
     gridview.setAdapter(new ImageAdapter(this)); 
    } 
} 

public class ImageAdapter extends BaseAdapter { 
    private MyActivity myAct; 
    public ImageAdapter(MyActivity c) { 
     myAct= c; 
    } 
    public View getView(int position, View convertView, ViewGroup parent) { 
     //usual getView stuff goes first 

     gridItem.setOnClickListener(new OnClickListener(){ 
      public onClick(View v){ 
       myAct.a = position; 
      } 
     } 
    } 
} 

希望這就是你想要做的。

+0

我可以做吐司這很好。我完全按照你的說法做了。我想在主要活動中設置一個公共變量。假設它有 public void setFlagVar(int theFlag){this.privateFlag = theFlag} – Brian

+0

這是我想在主要活動中調用公共方法嗎?我不能,除非它是靜止的。好的。有「處理程序」,但這種機制對於我想要做的事情來說非常複雜。如果按鈕是textViews,我可以做到這一點沒有圖層的層和回調... 或者我可以放棄Gridview和使用LinearLayout +滾動+一些向量來包含按鈕... 但是爲了清楚地說明問題你有一個主要活動,它創建一個GridView的按鈕,你希望點擊按鈕來改變主活動中的局部變量或者發送回調。 – Brian

+0

謝謝!我從例子中沒有意識到,除了上下文之外我可以傳遞任何東西!我正在看那個例子......我認爲世界上一切都很好......我可以通過傳遞任何公共職能回到主要對象,就像你所做的那樣,這就是我想要的。 – Brian

1

爲什麼你需要有2個onClickListeners。從onItemClickListener你必須主要活動你不能做所有你需要做的工作嗎?適配器是否需要執行MyOnClickListener工作?

您可以設置主活動的gridItem.setOnClickListener。無需每次都創建一個新的ListenerObject。

你只需要一個XML膨脹到getView包含按鈕

<Button android:text="Handle me" 
    android:id="@+id/btnHandleMe" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:onClick="buttonHandler" 
    android:clickable="true"> 

創建此功能,您的活動。

public void buttonHandler(View v) { 
     // Do your stuff here that new MyOnClickListener(position, mContext) whould do. 
    } 

您可以通過向適配器添加標籤來獲取此按鈕在列表/網格中填充的行/列的位置。

在getView添加

gridItem.setTag(position) 

,並因此,現在你從活動和默認的活動通知處理所有的點擊來自buttonHandler

retreive它
if(v.getTag instance of Integer) 
int position = (Integer)v.getTag(); 

+0

對不起,我不完全遵循。在上面的帖子中有兩個點擊處理程序的原因是因爲第一種方式不起作用... 至於用XML文件膨脹,我認爲這是限制...這是一個程序化生成的接口,它獲取從遠程系統關閉藍牙...不需要進入,但在運行時未知對象的數量。 由於按鈕在gridView中編寫,所以不會調用onItemClickListener,因爲該按鈕用於監聽點擊並吸收它。 – Brian

+0

然後我會創建一個自定義eventListener,我綁定到gridView並點擊按鈕。 http://tseng-blog.nge-web.net/blog/2009/02/17/how-implement-your-own-listener-android-java/。你說的是「正確的方式」。最快的方法是從適配器調用活動的自定義函數,但是必須使用靜態或將整個活動傳遞給適配器,這不是正確的技術。如果我或其他人沒有其他建議,請使用「創建您自己的eventlistener」方法 – weakwire

+0

謝謝。我相信這可以奏效。我希望有一個強大但不太複雜的解決方案。我可能會直接使用LinearLayout +按鈕,除非有人給我一個更好的方式來使用gridView作爲帶回調按鈕的容器......有許多關於ListView和按鈕FWIW的相關文章。我還沒有找到解決方案。 – Brian

相關問題