onListItemClick in Fragment - java

I need use onListItemClick in my class, it's an extends Fragment, I don't how can I use it in my class, somebody knows how can I call it?
public class VisitaFragment extends Fragment {
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_visita, container, false);
return rootView;
}
#Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Visitas visita = new Visitas();
List<Visita> visitas = visita.getVisitas();
final ListVisitaAdapter visitaAdapter = new ListVisitaAdapter(getActivity(), visitas);
ListView listVisitas = (ListView) getActivity().findViewById(R.id.lv_visita_emvisita);
listVisitas.setAdapter(visitaAdapter);
//-->> onListItemClick
}
}

listVisitas.setOnItemClickListener(new OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
}
});

Extend android.app.ListFragment instead of Fragment. It contains an onListItemClick() method that you can override.

Related

How to get the onClick function?

I am trying to make a scientific calculator inside a fragment. Actually following a YT video and that guy is doing all that in his mainactivity not the fragment. I used this code in xml of my fragment:
#Nullable
#Override
public View onCreateView(#NonNull LayoutInflater inflater, #Nullable ViewGroup container, #Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_scientific_calculator, container, false);
}
#Override
public void onViewCreated(#NonNull View view, #Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
previousCalculation = view.findViewById(R.id.previousCalculationView);
display = view.findViewById(R.id.displayEditText);
}
private void updateText(String strTOAdd) {
display.setText(strTOAdd);
}
public void zeroBTNPush(View view) {
updateText("0");
}
All I know is that to use findViewById in a fragment, I have to create a onViewCreated void. So after doing all this I should get the updateText function in fragment.java>design>attributes>onClick but I get nothing there
enter image description here
I'm new to this. Please help
You can just set OnClickListener in your fragment code like this
someBtn.setOnClickListener(new OnClickListener(){
// call the method you want to be excecuted when the buttun is being pressed
})
also you can specify it in the design, but for example I would prefer to work with the XML code directly - it's much more understantable for me
To use findViewById I think all you need is a View object, which is returned by onCreateView, so you could just do:
#Nullable
#Override
public View onCreateView(#NonNull LayoutInflater inflater, #Nullable ViewGroup container, #Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_scientific_calculator, container, false);
Button btn = view.findViewById(R.id.yourButtonId);
btn.setOnClickListener((View v) -> {
// do something here
});
}
You can do this in onViewCreated with the view that is passed in by getting the button and setting a click listener on it like this:
#Override
public void onViewCreated(#NonNull View view, #Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
//...
Button myButton = view.findViewById(R.id.myButton);
myButton.setOnClickListener((View v) -> {
// do button stuff
});
}

How to call fragment method from another fragment using androidx

I am using androidx jetpack navigation component in my application and I am confused on how to call a method in previous fragment from the current fragment.
There is currently no resource online on how to do this.
My implementation is below...
FRAGMENT A
This is the code sample of the first fragment.
public class FragmentOne extends Fragment{
private String holder;
private NavController navController;
private Button btn_next;
private void findViews(View view){
btn_next = view.findViewById(R.id.btn_next);
}
#Override
public void onCreate(#Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
#Nullable
#Override
public View onCreateView(#NonNull LayoutInflater inflater, #Nullable ViewGroup container, #Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_one, container, false);
return view;
#Override
public void onViewCreated(#NonNull View view, #Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
navController = Navigation.findNavController(view);
findViews(view);
holder = "VALUE IN HOLDER VARIABLE";
btn_next.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
navController.navigate(R.id.action_fundone_to_fragmenttwo);
}
});
}
public void executeInFragmentTwo(){
System.out.println(holder);
Toast.makeText(getContext(), holder, Toast.LENGTH_LONG).show();
}
}
FRAGMENT TWO
This is the code sample of the second fragment
public class FragmentTwo extends Fragment{
private NavController navController;
private Button btn_exec_fragment_one_method;
private void findViews(View view){
btn_exec_fragment_one_method= view.findViewById(R.id.btn_exec_fragment_one_method);
}
#Override
public void onCreate(#Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
#Nullable
#Override
public View onCreateView(#NonNull LayoutInflater inflater, #Nullable ViewGroup container, #Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_one, container, false);
return view;
#Override
public void onViewCreated(#NonNull View view, #Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
navController = Navigation.findNavController(view);
findViews(view);
btn_exec_fragment_one_method.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
//HOW DO I CALL FRAGMENT ONE METHOD FROM HERE
//The method with name "executeInFragmentTwo"
}
});
}
}
Please any help on this would really be appreciated.
Your first fragment will not be in a resumed state when the user is onto the second fragment.
If you need a function to be executed from another screen/fragment then you probably need to move this function to a ViewModel that is either tied to the lifecycle of the graph that these screens/fragments are part of or to the host activity lifecycle so that you get the same instance in both screens/fragments.
To inject a model that lives as long as your graph you use the following syntax:
private val model: MyViewModel by navGraphViewModels(R.id.myGraph) { ViewModelFactory() }

BindView of Butterknife on fragments #onclick NullPointError

public class InputFragment extends Fragment {
public ContractMVP.start start;
void setPresenter(ContractMVP.start start){
this.start=start;
}
#BindView(R.id.Start_btn)Button btn;
#OnClick(R.id.Start_btn) void setBtn() {
start.start();
}
public static InputFragment newInstance() {
return new InputFragment();
}
#Override
public void onActivityCreated(#Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v= inflater.inflate(R.layout.fragment_input, container, false);
ButterKnife.bind(this,v);
return v;
}
I get NullpointException when ever I try to click the Button. When I debug it says start=null,
but when I use traditional findViewByid it works fine
Did you add both dependences
compile 'com.jakewharton:butterknife:8.8.1'
annotationProcessor'com.jakewharton:butterknife-compiler:8.8.1'
Also check XML view Id and R.id.(yourId)

ViewPager with Fragment Android ( Func<T,T,T> alternative in Java (Android))

I am working with Tab Layout & View Pager which contains some views.
I've developed project for Xamarin Android and now I want to create with Android Studio.
I've implemented FragmentPagerAdapter same as former project, but problem is using Func in Fragment class.
My former class were like this :
public class SelectDateViewFragment : Android.Support.V4.App.Fragment
{
readonly Func<LayoutInflater, ViewGroup, Bundle, View> view;
public SelectDateViewFragment(Func<LayoutInflater, ViewGroup, Bundle, View> _view)
{
view = _view;
}
public override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Create your fragment here
}
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
// Use this to return your custom view for this Fragment
// return inflater.Inflate(Resource.Layout.YourFragment, container, false);
base.OnCreateView(inflater, container, savedInstanceState);
return view(inflater, container, savedInstanceState);
}
}
And I was able to create fragment and add to FragmentList like this :
viewPagerAdapter.addFragmentView((i, v, b) =>
{
var view = i.Inflate(Resource.Layout.SelectDateRecyclerViewLayout, v, false);
So, What would you recommend to be able to use same logic in my Activity ?
Thanks.
Okay problem's been solved by myself.
Basically I've implemented Func to Java with necessary parameters.
1) Creating an Interface
public interface Func<B,N,K, View> {
View invoke(B arg1,N arg2,K arg3);
}
2) Implementing Interface
class FuncImpl<B,N,K, View> implements Func<B,N,K, View> {
Func<B,N,K, View> function;
public FuncImpl(Func<B,N,K, View> function) {
this.function = function;
}
#Override
public View invoke(B arg1,N arg2,K arg3) {
return this.function.invoke(arg1, arg2, arg3);
}}
3) Using class in Fragment
public class SelectDateViewFragment extends Fragment {
Func<LayoutInflater,ViewGroup,Bundle,View> view;
public SelectDateViewFragment( Func<LayoutInflater,ViewGroup,Bundle,View> view){
this.view = view;
}
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
return view.invoke(inflater,container,savedInstanceState);
}}
4) Setting ViewPager Adapter
selectDateAdapter = new SelectDateAdapter(getSupportFragmentManager(),charSequences);
selectDateAdapter.addFragmentView(new Func<LayoutInflater, ViewGroup, Bundle, View>() {
#Override
public View invoke(LayoutInflater arg1, ViewGroup arg2, Bundle arg3) {
View view = arg1.inflate(R.layout.layout_select_date_recyclerview,arg2,false);
return view;
}
});
viewPagerView.setAdapter(selectDateAdapter);
So this solution was uncommon but makes process quite simple.

Android: Accessing View object in a Fragment class

How do I access the View object created at the onCreateView method of a Fragment class from another method? I need to access the view in order to reference the Gridview control of my layout.
public class comments_frag_activity extends Fragment{
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View android = inflater.inflate(R.layout.comments_frag, container, false);
}
//other methods.....
//other methods .....
//other methods .....
public void printTest()
{
if(!commentsGallery.isEmpty())
{
//I cant access the view object 'android'
GridView list = (GridView)android.findViewById(R.id.commentinglist);
CommentsAdapter bA = new CommentsAdapter(ctx, R.layout.comments_frag, commentsGallery);
list.setAdapter(bA);
}
}
Save the view to a class variable.
private View view;
......
.....
#Override
onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
view = inflater.inflate(your layout)
}
Declare it globally instaed of local variable
Store view's references after onCreateView in onViewCreated:
#Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
localGridView = (GridView) view.findViewById(R.id.commentinglist);
}
Try This
public class comments_frag_activity extends Fragment{
private View android;
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
android = inflater.inflate(R.layout.comments_frag, container, false);
}
public void printTest()
{
if(!commentsGallery.isEmpty())
{
GridView list = (GridView)android.findViewById(R.id.commentinglist);
CommentsAdapter bA = new CommentsAdapter(ctx, R.layout.comments_frag, commentsGallery);
list.setAdapter(bA);
}
}
If you don't won't to store view globally (for some reason), you can always do something like
public void printTest()
{
if(!commentsGallery.isEmpty())
{
//I cant access the view object 'android'
GridView list = (GridView) getView().findViewById(R.id.commentinglist);
CommentsAdapter bA = new CommentsAdapter(ctx, R.layout.comments_frag, commentsGallery);
list.setAdapter(bA);
}
}
getView() will return the root layout inflated in onCreateView

Categories

Resources