ImageButton onClick не вызывается в RelativeLayout во фрагменте с использованием прозрачной панели действий
Есть идеи, почему мой ImageButton не работает в моем фрагменте? Кнопка ImageButton содержит Drawable и является прозрачной. Когда я помещаю его в свой RelativeLayout ниже, он работает...
<RelativeLayout
android:id="@+id/rl_newsdet_root"
xmlns:android="http://schemas.android.com/apk/res/android"
android:background="@drawable/bg"
android:focusableInTouchMode="true"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_newsdet_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:layout_marginTop="7dp"
android:textSize="20sp"
android:layout_centerHorizontal="true"
/>
<ImageButton
android:id="@+id/btn_newsdet_back"
android:layout_marginLeft="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"
android:src="@drawable/bt_back"
/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="?android:attr/actionBarSize"
android:background="@color/white"
android:gravity="left"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tv_newsdet_name"
android:textSize="18sp"
android:layout_marginLeft="10dp"
android:layout_marginTop="5dp"
android:textStyle="bold"
android:textColor="@color/cyan"
android:background="@color/grey"
android:paddingLeft="1dp"
android:paddingRight="1dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tv_newsdet_time"
android:textColor="@color/white"
android:textSize="18sp"
android:layout_toRightOf="@+id/tv_newsdet_name"
android:paddingLeft="1dp"
android:paddingRight="1dp"
android:background="@color/grey"
android:layout_marginTop="5dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Text"
android:id="@+id/tv_newsdet_text"
android:layout_marginLeft="10dp"
android:layout_marginTop="1dp"
android:layout_below="@+id/tv_newsdet_name"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
</RelativeLayout>
Мой onClickListener с Android Аннотации
@ViewById
ImageButton btn_newsdet_back;
@Click(R.id.btn_newsdet_back)
void back() {
Log.i(TAG,"back");
mActivity.popFragments();
}
EDIT onClick работает (называется), когда его ниже TextView. Кто-нибудь может объяснить, почему?
5 ответов
Я решил это. Проблема была в том, что я использовал прозрачную панель действий, которая была наложением, которое я искал.
Следующая строка в моем onCreate() решила это:
getActivity().getActionBar().hide();
Нет необходимости добавлять кликабельную кнопку изображения. Попробуйте следующее:
<ImageButton
android:id="@+id/btn_newsdet_back"
android:layout_marginLeft="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="mymethod"
android:src="@drawable/bt_back"
/>
добавить в Java
public void mymethod(View v)
{
//your method
}
Вы можете попробовать этот код:
Это код фрагмента: TestFragment.java
public class TestFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
// TODO Auto-generated method stub
View view = inflater.inflate(R.layout.fragment_one, container, false);
ImageButton button = (ImageButton) view.findViewById(R.id.img2);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(getActivity(), "Click on fragment ",
Toast.LENGTH_LONG).show();
}
});
return view;
}
}
Это макет "TestFragment"
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageButton
android:id="@+id/img2"
android:layout_width="100dp"
android:layout_height="80dp"
android:src="@drawable/ic_launcher" />
</RelativeLayout>
Это код MainActivity.java
public class MainActivity extends FragmentActivity {
ImageButton imgButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_main);
FragmentManager fragmentManager = getSupportFragmentManager();
TestFragment fragment = (TestFragment) fragmentManager
.findFragmentById(R.id.fragment);
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
// fragmentTransaction.add(fragment, "");
fragmentTransaction.commit();
}
}
Это макет MainActivity
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<fragment
android:id="@+id/fragment"
android:name="com.alarmdemo.TestFragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
Вот ImageButton
находится в Fragment
и работает нормально.
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_sample,
container, false);
addListenerOnButton();
}
private void addListenerOnButton() {
imageButton = (ImageButton) rootview.findViewById(R.id.imageButton1);
imageButton.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
Toast.makeText(MainActivity.this,
"ImageButton is clicked!", Toast.LENGTH_SHORT).show();
}
});
}
Если, как вы сказали, все работает, когда вы помещаете кнопку внутри RelativeLayout ниже, причина должна заключаться в том, что второй RelativeLayout имеет свои параметры, объявленные как:
android:layout_width="match_parent"
android:layout_height="match_parent"
Это означает, что он "заполняет" своего родителя, то есть оригинальный RelativeLayout, содержащий кнопку. Это как будто вы создаете слой, который закрывает кнопку и не позволяет работать с ней. Когда вы нажимаете на кнопку, вы фактически нажимаете на второй RelativeLayout.
Я на самом деле не пробовал это, но вы должны рассмотреть установку:
android:layout_below="@id/btn_newsdet_back"
На RelativeLayout под кнопкой.