我創建了自定義RelativeLayout
視圖,我使用merge
標籤膨脹。
在這個自定義視圖中,我有一個按鈕,我希望它做某件事。
我試過很多東西,但按鈕只是拒絕點擊。用按鈕不可點擊的Android自定義視圖
奇怪的部分是,我可以找到的意見,並改變他們的知名度很好。
是否有可能以這種方式點擊按鈕,還是應該以不同的方式完成?
這個事情我已經試過:
- 匿名內部類爲
onClickListener
- XML屬性爲
onClick
- 查看
onClick
與onClickListener(this)
- 檢查它是否是可點擊的代碼(返回true)
- 向XML和代碼添加了
clickable(true)
。 - 從構造函數,而不是
getContext()
- 感動邏輯從
init()
到onFinishInflate()
- 使用的視圖從吹氣私人方面找觀點 從
- 切換到
LayoutInflater
inflate()
充氣自定義視圖:
<?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();
}
}
爲什麼你在這裏使用合併標籤?您在此處使用的佈局僅適用於CustomView中的通貨膨脹,因此此處不需要合併。如果用佈局類型替換合併,它工作嗎? – Henry
@Henry我使用了合併標籤,因爲我閱讀了這個[link](http://trickyandroid.com/protip-inflating-layout-for-your-custom-view/),它顯示了層次結構中額外的佈局不使用合併標籤。另外,當我將合併更改爲RelativeLayout時,我的TextView和Button不可見。 –
給我幾個小時。我會調試它並讓你知道。 – Henry