I'm trying to remove a layout with the click of a button.
I have this method in my MainActivity.java file:
public void goBack(View view) {
TableLayout parent = (TableLayout) findViewById(R.id.activity_main);
RelativeLayout child = (RelativeLayout) findViewById(R.id.activity_displayMessage);
parent.removeView(child);
}
It is fired when this button is clicked in the view I want to remove:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="#string/button_removeView"
android:onClick="goBack" />
But it gives me this message:
java.lang.IllegalStateException: Could not find method goBack(View) in
a parent or ancestor Context for android:onClick
But MainActivity is my main file for all my methods, so I'm not sure why it can't find it.
Where should I put it so that it can be found?
Thanks!
To avoid such problems remove onClick from Layout and instead of that add OnClickListener programmically.
First add id to element
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="#string/button_removeView"
android:id="#+id/button"
/>
Second add listener
getView().findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//here Your code
}
});
In case of using fragment best place will be onCreateView method:
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_layout, container, false);
v.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//here Your code
}
});
return v;
}
You can also set fragment as listener like:
v.findViewById(R.id.button).setOnClickListener(this);
and in this case fragement must implement OnClickListener interface.
Use parent.removeViewAt(0) where '0' is the index of the child . It removes the view at particular index .
Related
I create two fragments:
<fragment
android:name="BoxFragment"
android:layout_width="150dp"
android:layout_height="80dp"
android:id="#+id/box_fragment_1"
android:layout_below="#+id/box_fragment_2"
android:layout_alignParentStart="true"
android:layout_marginTop="42dp"
tools:layout="#layout/fragment_box" />
<fragment
android:layout_width="150dp"
android:layout_height="50dp"
android:id="#+id/box_fragment_2"
android:layout_centerVertical="true"
android:layout_alignParentStart="true"
tools:layout="#layout/fragment_box" />
Layout of this fragments:
<ImageButton
android:layout_width="197dp"
android:layout_height="197dp"
android:id="#+id/ibPress"
android:layout_gravity="center" />
So, i register OnClickListener:
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view= inflater.inflate(R.layout.fragment_box, container, false);
ImageButton imageButton= (ImageButton) view.findViewById(R.id.ibPress);
imageButton.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
Log.i(LOG_TAG,this.toString());
//how to know,wich button clicked?
presenter.onButtonClick(...?);
}
});
return view;
}
So, i want to know from what fragment button was pressed?
Should i need to reference View into presenter.onButtonClick?
At presenter, i want to know what button was pressed and then do some work.
Thank you!
You can modify your presenter.onButtonClick() by
presenter.onButtonClick(int fragmentId) or presenter.onButtonClick(String fragmentTagName)
Then in that method using switch case you can perform the action based on the id or tag of that particular fragment.
You can get the id of the currently clicked view using getId().See the code below.
imageButton.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
switch(v.getId()) {
case R.id.b1:
// it was the first button
break;
case R.id.b2:
// it was the second button
break;
}
}
}
Please read the docs for more info.
I have a button in android which i have defined in fragment_main.xml as -
<Button
android:id="#+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="#string/love_button_text"
android:onClick="onLoveButtonClicked"
/>
the main_activity xml file is as follows -
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="#+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.newa.newapp2.MainActivity"
tools:ignore="MergeRootFrame" >
<Button
android:id="#+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="100sp"
android:text="#string/a_button"
android:onClick="onLoveButtonClicked1"
/>
</FrameLayout>
Now as there is a onClick event defined i wanted to define in a separate class file as follows -
public class AndroidLove extends Activity {
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onLoveButtonClicked1(View view) {
TextView tv = (TextView) findViewById(R.id.anotherText);
tv.setVisibility(View.VISIBLE);
}
}
This compiles fine but at run time throws the error
"could not find the event listener named onLoveButtonClicked"
This however is working fine if i write the function in my MainActivity.java
Any ideas?
Thanks
Use an anonymous inner class in your fragment class.
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_main, container, false);
Button button = (Button)view.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
//your code here
}
}
}
Lastly remove this from your xml:
android:onClick="onLoveButtonClicked"
Hello the Button is in your fragment_main.xml file
and you are setting content view in activity_main to AndroidLove activity.
i think you need to write onLoveButtonClicked() method inside Fragment not in activity.
Method name from xml and java file must same.
activity/fragment that set that xml file as content view it must be have same name method with view as params.
Thanx.
I'm using a fragment to show a GridView with some images and a Button to add new Images. The GridView works fine, but my Button's onClick method is never called.
This is my Fragment's onCreateView method:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_picture_grid_view, container, false);
addPictureButton = (Button) rootView.findViewById(R.id.fragment_grid_view_add_button);
addPictureButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
CameraOrAlbumDialogFragment dialogFragment = new CameraOrAlbumDialogFragment();
dialogFragment.show(mContext.getSupportFragmentManager(), "CameraPicker");
}
});
imageGridView = (GridView) rootView.findViewById(R.id.fragment_grid_view);
imageGridView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
}
In my onActivityCreated method I do all the Adapter stuff for my GridView and it works normally, it can capture my clicks and longClicks. The only thing not working is the Button's onCLick method. I can see the Button icon changing when I touch it, but the functions inside my onClickListener method are never called. Any help?
EDIT
This is my fragment layout:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<GridView
android:id="#+id/fragment_grid_view"
android:layout_width="match_parent"
android:layout_height="150dp"
android:numColumns="auto_fit" >
</GridView>
<Button
android:id="#+id/fragment_grid_view_add_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Add Picture" />
</LinearLayout>
EDIT2
Turns out that there was another button overlaping my button, so that button was receiving the onClick events instead of my button. I was able to figure it out when I used the Hierarchy view in Eclipse. Very usefull.
Try this.
public class CarCheckFrameFragment extends Fragment implements View.OnClickListener {
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View rootView = inflater.inflate(R.layout.fragment_car_check_frame, container, false);
Button button = rootView.findViewById(R.id.button);
button.setOnClickListener(this);
return rootView;
}
#Override
public void onClick(View v) {
switch(v.getId()) {
case R.id.button:
doSomething();
break;
}
}
}
I figured thet I had another View overlapping my button, that's why it was never called.
SO DUMB! Sorry.
You should use getChildFragmentManager() when using fragments inside other fragments.
I have this code inside onCreateView in a fragment:
star = (ImageView) rootView.findViewById(R.id.heart);
star.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View v) {
Toast.makeText(getActivity(),"the star was clicked",
Toast.LENGTH_LONG).show();
}
});
and it's giving null pointer exception. Anyone has any idea of what could it be ?
EDIT: I am editing because the answers didn't make it clear how to resolve the issue. The problem is that rootView, the view I am inflating, is a custom list view, on which I later inflate layout item_row to define a single row in the view. The heart id is defined in this item_row but I am trying to access it from the rootView which is not possbile of course. So could anyone provide me an example of how could I do it ?
I am doing the same thing. Here is an example that works. Make sure the View you are trying to access has an id defined in the layout you are inflating. In my example R.layout.lesson_video_fragment has an ImageView defined in with the ID R.id.lesson_video.
layout file (lesson_video_fragment.xml):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="#+id/lesson_video"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:contentDescription="Video"
android:scaleType="centerCrop"
/>
</LinearLayout>
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.lesson_video_fragment, container, false);
videoImage = (ImageView)v.findViewById(R.id.lesson_video);
videoImage.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View v) {
//do your thing
}
});
R.id.heart does not belong to rootView. It means that is not declared inside the layout you inflated inside your onCreateView.
I have a listview in Fragment.
In my listitem layout contains three buttons,like:
<LinearLayout
android:id="#+id/back"
android:layout_width="match_parent"
android:layout_height="#dimen/msg_item_h">
<Button
android:layout_width="#dimen/msg_delete_btn_w"
android:layout_height="#dimen/msg_delete_btn_w"
android:id="#+id/btnDelete"
android:onClikc="onDeleteClick"
android:text="delete" />
<Button
android:layout_width="#dimen/msg_delete_btn_w"
android:layout_height="#dimen/msg_delete_btn_w"
android:id="#+id/btnAdd"
android:onClikc="onAddClick"
android:text="add" />
<Button
android:layout_width="#dimen/msg_delete_btn_w"
android:layout_height="#dimen/msg_delete_btn_w"
android:id="#+id/btnEdit"
android:onClikc="onEditClick"
android:text="edit" />
I want to handle the event onDeleteClick,onEditClick and onAddClick in my fragment.
But everytime the fragmentActivity got the event.
Is there a way to solve it?
You can do something like this in your fragment:
view.findViewById(R.id.btnDelete).setOnClickListener(new OnClickListener() {
#Override
public void onClick(final View v) {
//Do your stuff here
}
});
If you do this you wouldn't need android:onClick="onDeleteClick" anymore.
The following solution handles onClick events, and works for Activity as well as Fragments:
public class YourFragmentClass extends Fragment implements OnClickListener{
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_xml_file, container, false);
Button delete = (Button) view.findViewById(R.id.btnDelete);
delete.setOnClickListener(this);
return view;
}
#Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnDelete:
// Do something here...
break;
}
}
}
android:onClick delivers the event to the Context, so this is impossible.
According to View documentation:
Name of the method in this View's context to invoke when the view is clicked. This name must correspond to a public method that takes exactly one parameter of type View. For instance, if you specify android:onClick="sayHello", you must declare a public void sayHello(View v) method of your context (typically, your Activity).