So I haven't seen any question like this and I have a problem I don't know how to start the other class from the fragment. I have been trying all day and I still can't find the answer. First of all how do I start my imageadapter class and how the hell can I write additional methods into the class and then execute them in the fragment class?
public class ImageFragment extends Fragment {
#Nullable
#Override
public View onCreateView(#NonNull LayoutInflater inflater, #Nullable ViewGroup container, #Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_image, container, false);
GridView gridView = (GridView)getView().findViewById(R.id.gridView);
gridView.setAdapter(new imageadapter(getContext()));
}
}
but why does this then not work ?
public class ImageFragment extends Fragment {
#Nullable
#Override
public View onCreateView(#NonNull LayoutInflater inflater, #Nullable ViewGroup container, #Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_image, container, false);
}
#Override
public void onViewCreated(#NonNull final View view, #Nullable Bundle savedInstanceState) {}
GridView gridView = (GridView)getView().findViewById(R.id.gridView);
gridView.setAdapter(new imageadapter(this));
}
I still get errors by the words this and the setAdapter.
All you need to do is add an onViewCreated method where you can do call your methods and other stuff. Here's my code.
#Nullable
#Override
public View onCreateView(#NonNull LayoutInflater inflater, #Nullable ViewGroup container, #Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_upcoming, container, false);
}
#Override
public void onViewCreated(#NonNull final View view, #Nullable Bundle savedInstanceState) {
//you can call your methods and find your views in here
setHasOptionsMenu(true);
final FloatingActionButton fab = view.findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
Intent intent = new Intent(getActivity(), CreateEditAppointmentActivity.class);
startActivityForResult(intent, RC_ADD_CLIENT);
}
});
coordinatorLayout = view.findViewById(R.id.upcomingLayout);
}
Related
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
});
}
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() }
public class select_fragment extends Fragment {
#Nullable
#Override
public View onCreateView(#NonNull LayoutInflater inflater, #Nullable ViewGroup container, #Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_select, null);
}
private void button_parking(){
Intent myIntent = new Intent(f, parking.class);
startActivity(myIntent);
}
}
try this...
public class select_fragment extends Fragment {
#Nullable
#Override
public View onCreateView(#NonNull LayoutInflater inflater, #Nullable ViewGroup
container, #Nullable Bundle savedInstanceState) {
Button your_button = (Button) getActivity.findViewById(R.id.your_id_button)
your_button.setOnClickListener(new OnClickListener() {
public void onClick(View v)
{
button_parking();
}
});
return inflater.inflate(R.layout.fragment_select, null);
}
private void button_parking(){
Intent myIntent = new Intent(getActivity(), parking.class);
startActivity(myIntent);
}
}
You haven't bind the view to your fragment so the click button can't work. You need to bind the view with findViewById(). Usually you need to do the binding by overriding onViewCreated() something like this:
public class select_fragment extends Fragment {
#Nullable
#Override
public View onCreateView(#NonNull LayoutInflater inflater, #Nullable ViewGroup container, #Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_select, null);
}
#Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
// bind the view here.
Button button = findViewById(R.id.your_button);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//call button method here
button_parking();
}
});
}
private void button_parking() {
Intent myIntent = new Intent(f, parking.class);
startActivity(myIntent);
}
}
I have a fragment and have linear layout that contains 2 simple card views.
How can I make card view clickable cardviews?
I have searched, but all topics are about cardviews in recycler view ... But I have a simple clickable cardview.
public class popFragment extends Fragment {
public popFragment()
{
}
#Override
public void onCreate(#Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
#Nullable
#Override
public View onCreateView(LayoutInflater inflater, #Nullable ViewGroup container, #Nullable Bundle savedInstanceState) {
View view= inflater.inflate(R.layout.popfragment,container,false);
return view;
}
}
You can simply assign id in your layout xml to each card view. then in oncreateView() of the fragment bind the view and use mycardView.setOnclickListener.... .
public class popFragment extends Fragment {
private CardView cardView1;
private CardView cardView2;
public popFragment()
{
}
#Override
public void onCreate(#Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
#Nullable
#Override
public View onCreateView(LayoutInflater inflater, #Nullable ViewGroup container, #Nullable Bundle savedInstanceState) {
View view= inflater.inflate(R.layout.popfragment,container,false);
cardView1 = view.findViewById(R.id.my_card_view_1);
cardView2 = view.findViewById(R.id.my_card_view_2);
cardView1.setOnClickListener(v->{
//set on click functions here
});
cardView2.setOnClickListener(v->{
//set on click functions here
});
return view;
}
}
do not forget to assign the corresponding ids in your layout.xml
Butterknife is working well when i am using it on Activities, but not working when I am trying to use it in a fragment :
public class SettingsFragment extends Fragment {
private static final String TAG = "SettingsFragment";
#BindView(R.id.settings_email) TextView _settingsMail;
#BindView(R.id.settings_password) TextView _passwordMail;
#BindView(R.id.settings_token) TextView _tokenMail;
#Nullable
#Override
public View onCreateView(LayoutInflater inflater, #Nullable ViewGroup container, #Nullable Bundle savedInstanceState) {
//returning our layout file
final View view = inflater.inflate(R.layout.fragment_3_settings, container, false);
ButterKnife.bind(this, view);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this.getContext());
String email = prefs.getString("email", null);
String passwd = prefs.getString("password", null);
String token = prefs.getString("token", null);
_settingsMail.setText(email);
_passwordMail.setText(passwd);
_tokenMail.setText(token);
return inflater.inflate(R.layout.fragment_3_settings, container, false);
}
You have to return the view that you already have inflated, not inflate another view again.
Instead of:
return inflater.inflate(...);
Do this:
return view;
Try waiting until you know the view has been fully constructed before altering the layout.
#Override
public View onCreateView(LayoutInflater inflater, #Nullable ViewGroup container, #Nullable Bundle savedInstanceState) {
//returning our layout file
final View view = inflater.inflate(R.layout.fragment_3_settings, container, false);
ButterKnife.bind(this, view);
return view;
}
#Override
public void onViewCreated(View view, #Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this.getContext());
String email = prefs.getString("email", null);
String passwd = prefs.getString("password", null);
String token = prefs.getString("token", null);
_settingsMail.setText(email);
_passwordMail.setText(passwd);
_tokenMail.setText(token);
}
why nobody uses unbinder?
according to documentation , if you work with fragments, you have to use unbinder
private Unbinder unbinder;
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate...;
unbinder = ButterKnife.bind(this, view);
return view;
}
and
#Override
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
<ImageView
android:layout_marginTop="#dimen/padding_top_8dp
android:layout_centerHorizontal="true"
android:tint="#color/colorPrimary"
android:padding="#dimen/padding_top_8dp"
android:src="#drawable/ic_scan_qr_code"
android:id="#+id/qr__code_icon_iv"
android:background="#drawable/circle_shape_white"
android:layout_width="40dp"
android:layout_height="40dp" />
remove #id/qr__code_icon_iv
add #id/qr_code_icon_iv
This work for me:
...
#BindView(R.id.text_input)
TextView text_input;
#Nullable
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_home, container, false);
ButterKnife.bind(this, view);
return view;
}
#Override
public void onActivityCreated(#Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
text_input.setText("Hello Lima, PerĂº");
...