0

我創建了自定義RelativeLayout視圖,我使用merge標籤膨脹。
在這個自定義視圖中,我有一個按鈕,我希望它做某件事。
我試過很多東西,但按鈕只是拒絕點擊。用按鈕不可點擊的Android自定義視圖

奇怪的部分是,我可以找到的意見,並改變他們的知名度很好。

是否有可能以這種方式點擊按鈕,還是應該以不同的方式完成?

這個事情我已經試過:

  • 匿名內部類爲onClickListener
  • XML屬性爲onClick
  • 查看onClickonClickListener(this)
  • 檢查它是否是可點擊的代碼(返回true)
  • 向XML和代碼添加了clickable(true)
  • 從構造函數,而不是getContext()
  • 感動邏輯從init()onFinishInflate()
  • 使用的視圖從吹氣私人方面找觀點
  • inflate()
  • 切換到LayoutInflater

充氣自定義視圖:

<?xml version="1.0" encoding="utf-8"?> 
<merge 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TextView 
     android:id="@+id/internet_view_text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:text="@string/internet_offline"/> 

    <custom.IconView 
     android:id="@+id/internet_view_icon" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:text="ICON" 
     android:visibility="invisible" 
     android:layout_below="@+id/internet_view_text"/> 

    <Button 
     android:id="@+id/internet_view_button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:text="BUTTON" 
     android:clickable="true" 
     android:layout_below="@+id/internet_view_text"/> 
</merge> 
父視圖的10

相關部分:

<custom.NoInternetView 
    android:id="@+id/webview_no_content" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:visibility="invisible" 
    app:automaticReconnect="false"/> 

類文件:

public class NoInternetView extends RelativeLayout implements View.OnClickListener { 

    private static final String TAG = NoInternetView.class.getSimpleName(); 

    private static ConnectivityChangeListener listener; 
    private static boolean automaticReconnect; 
    private Context mContext; 
    private View view; 

    private Button button; 

    public NoInternetView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     mContext = context; 
     TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.NoInternetView, defStyleAttr, 0); 
     automaticReconnect = a.getBoolean(R.styleable.NoInternetView_automaticReconnect, false); 
     a.recycle(); 
     init(); 
    } 

    public NoInternetView(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public NoInternetView(Context context) { 
     this(context, null); 
    } 

    @Override 
    protected void onFinishInflate() { 
     Log.d(TAG, "onFinishInflate"); 
     super.onFinishInflate(); 

     button = (Button) view.findViewById(R.id.internet_view_button); 
     button.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.d(TAG, "Clicked on some Button"); 
       if (listener != null && NetworkHelper.hasAccess(getContext())) { 
        listener.connected(); 
       } 
      } 
     }); 
     button.setClickable(true); 

     boolean clicked = button.callOnClick(); 
     Log.d(TAG, "clicked: "+clicked); 

     TextView text = (TextView) view.findViewById(R.id.internet_view_icon); 
     text.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.d(TAG, "Clicked on some TextView"); 
       if (listener != null && NetworkHelper.hasAccess(getContext())) { 
        listener.connected(); 
       } 
      } 
     }); 

     //check if the attribute 'automaticReconnect' is set to true 
     //if so, show an icon instead of a button 
     if (automaticReconnect){ 
      button.setVisibility(INVISIBLE); 
      view.findViewById(R.id.internet_view_icon).setVisibility(VISIBLE); 
     } 

    } 

    public void init(){ 
     Log.d(TAG, "init"); 
     view = LayoutInflater.from(mContext).inflate(R.layout.no_internet_view, this, false); 
    } 

    @Override 
    public boolean dispatchKeyEvent(KeyEvent event) { 
     Log.d(TAG, "something happened?"); 
     return super.dispatchKeyEvent(event); 
    } 

    @Override 
    public void onClick(View v) { 
     Log.d(TAG, "Clicked on Button(TextView)"); 
     if (listener != null && NetworkHelper.hasAccess(getContext())){ 
      listener.connected(); 
     } 
    } 
+1

爲什麼你在這裏使用合併標籤?您在此處使用的佈局僅適用於CustomView中的通貨膨脹,因此此處不需要合併。如果用佈局類型替換合併,它工作嗎? – Henry

+0

@Henry我使用了合併標籤,因爲我閱讀了這個[link](http://trickyandroid.com/protip-inflating-layout-for-your-custom-view/),它顯示了層次結構中額外的佈局不使用合併標籤。另外,當我將合併更改爲RelativeLayout時,我的TextView和Button不可見。 –

+0

給我幾個小時。我會調試它並讓你知道。 – Henry

回答

0

所以我得到它的工作。以下是我所做的工作。

  1. RelativeLayout更換merge標籤,因爲你是充氣佈局視圖中顯示。這裏更多的信息:Android xml merge layout error on inflate

  2. 您已設置android:visibility="invisible",更改到android:visibility="visible"(這是剛拿到視圖中可見,你可以在以後改變它編程)

  3. 以下行添加到init()您的NoInternetView的方法。你用所有的視圖來擴大布局,但只有當你添加這個視圖時,你才能看到它。

    public void init(){ 
         Log.d(TAG, "init"); 
         view = LayoutInflater.from(mContext).inflate(R.layout.no_internet_view, this, false); 
         this.addView(view);} 
    

一旦你與這個工作,該按鈕將是可見的,點擊該按鈕可點擊。您可以使用匿名onClickListener或使視圖實現onClickListener並覆蓋onClick()方法。任何工作。

+0

this.addView(view)將導致循環並最終出現內存不足異常。 –

+0

不完全。你已經創建了一個CustomView,這是一個RelativeLayout。您需要在屏幕上顯示某些內容,以便在CustomView中擴展布局。問題是,單靠充氣是不夠的。您需要將該誇大的視圖添加到CustomView。我認爲你在其他地方做錯了一些事情。在進行所有這些修改後,我運行了您的代碼。對我來說工作得很好。 – Henry

+0

它是否有任何區別,這種佈局加載到片段佈局? –

相關問題