Adding 2 variables in a single TextUtils - java

I have this problem in which I have two variables - 'mobile_input' & 'mobile_input_login'. I also have 2 TextUtils also.
Instead of making two different TextUtils, I want to make one TextUtils. I have searched on the web but there is no relevant question like that.
The code:
mobile_input.addTextChangedListener(new TextWatcher() {
#Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
#Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (TextUtils.isEmpty(s.toString().trim())) {
clear2.setVisibility(View.INVISIBLE);
} else {
clear2.setVisibility(View.VISIBLE);
}
}
#Override
public void afterTextChanged(Editable s) {
}
});
mobile_input_login.addTextChangedListener(new TextWatcher() {
#Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
#Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (TextUtils.isEmpty(s.toString().trim())) {
clear4.setVisibility(View.INVISIBLE);
} else {
clear4.setVisibility(View.VISIBLE);
}
}
#Override
public void afterTextChanged(Editable s) {
}
});
Thank you for your answer in advance.

You can create a custom class implementing TextWatcher:
public class MyTextWatcher implements TextWatcher {
private View view;
public MyTextWatcher(View view) {
this.view = view;
}
#Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
#Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (TextUtils.isEmpty(s.toString().trim())) {
view.setVisibility(View.INVISIBLE);
} else {
view.setVisibility(View.VISIBLE);
}
}
#Override
public void afterTextChanged(Editable s) {
}
});
And then use it on both text fields:
mobile_input.addTextChangedListener(new MyTextWatcher(clear2));
mobile_input_login.addTextChangedListener(new MyTextWatcher(clear4));
I hope that answers your question.

Related

Load and Edit Specific Data Previously Filled

I am making a notes app and my notes are autosaved to Firebase Database. So far a user can make their own notes but cannot edit them. I want the app to open the same note (meaning the title and desc fields will hold the data entered last time) if clicked so they can edit it but don't know how, I don't even know what to look for online as this is my first project.
New note creation & autoupdate
(One listener for title and one for body)
public class NewNoteActivity extends AppCompatActivity{
private EditText editText, etd;
private FirebaseAuth fAuth;
final DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference()/* THIS!*/.child("Users").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("posts").push();
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new_note);
editText = findViewById(R.id.etx);
etd = findViewById(R.id.etdx);
final Map<String, Object> map = new HashMap<>();
map.put("id", databaseReference.getKey());
editText.addTextChangedListener(new TextWatcher() {
#Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
#Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
#Override
public void afterTextChanged(Editable s) {
map.put("title", editText.getText().toString());
databaseReference.setValue(map);
}
});
etd.addTextChangedListener(new TextWatcher() {
#Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
#Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
#Override
public void afterTextChanged(Editable s) {
map.put("desc", etd.getText().toString());
databaseReference.setValue(map);
}
});
}
Display the notes
(and set onClick action)
adapter = new FirebaseRecyclerAdapter<Model, ViewHolder>(options) {
#Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item, parent, false);
return new ViewHolder(view);
}
#Override
protected void onBindViewHolder(final ViewHolder holder, final int position, final Model model) {
holder.setTxtTitle(model.getmTitle());
holder.setTxtDesc(model.getmDesc());
//holder.setmId(model.getmId());
holder.root.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
//Here I need to find somehow to get back to the note I clicked on
}
});
}
};
recyclerView.setAdapter(adapter);
This is how the list looks
Since I'm not able to post images yet: https://i.imgur.com/MDQ15a6.png
Each block is a note. (Ignore the B)

How do I include a search for my custom listview in android studio?

This is from the Main Activity class. I have an arraylist of arrays and need to create a search bar for the listview.
adapter = new ArrayAdapter<String[]>(this, R.layout.list_view, android.R.id.text1, spellList)
{
public View getView(int position, View convertView, ViewGroup parent)
{
View view = super.getView(position, convertView, parent);
String[] entry = spellList.get(position);
TextView text1 = (TextView) view.findViewById(android.R.id.text1);
TextView text2 = (TextView) view.findViewById(android.R.id.text2);
text1.setText(entry[0]);
text2.setText(entry[1]);
return view;
}
};
wizList.setAdapter(adapter);
searchText.addTextChangedListener(new TextWatcher() {
#Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
#Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
#Override
public void afterTextChanged(Editable s) {
}
});
This is the data in an Arraylist of string arrays. Prefered if searched by the spell name.
final ArrayList<String[]> spellList;
public WizardDatabase()
{
spellList = new ArrayList<>();
spellList.add(new String[] { "Resistance", "Subject gains +1 on saving throws."});
spellList.add(new String[] { "Acid Splash", "Orb deals 1d3 acid damage."});
spellList.add(new String[] { "Detech Poison", "Detects poison in one creature or small object."});
public ArrayList<String[]> getList()
{
return spellList;
}
thanks.
If it's simple String search only then use the following code
searchText.addTextChangedListener(new TextWatcher() {
#Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
#Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
#Override
public void afterTextChanged(Editable s) {
if (s.length() > 3) { // it's for performance I've put 3 you can change it
adapter.getFilter().filter(s.toString());
}
}
});

Android Edittext Drawable click stuck focus

I have three edittext on one layout. When it's empty, then I remove the right drawable. When it isn't empty, I added the drawable. When you click to drawable, I clear the edittext.
When I clicked to rightdrawable, the cursor was stuck, and underline stay colored. Rarely I have a 2-3 cursor. Why?? What I do bad?
BAD:
GOOD:
The Layout:
<EditText
android:id="#+id/et1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableRight="#mipmap/ic_launcher"/>
<EditText
android:id="#+id/et2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableRight="#mipmap/ic_launcher"/>
<EditText
android:id="#+id/et3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableRight="#mipmap/ic_launcher"/>
The MainActivity
public class MainActivity extends AppCompatActivity {
private DrawableState etstate1;
private DrawableState etstate2;
private DrawableState etstate3;
private EditText et2;
private EditText et1;
private EditText et3;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et1 = (EditText)findViewById(R.id.et1);
et2 = (EditText)findViewById(R.id.et2);
et3 = (EditText)findViewById(R.id.et3);
etstate1 = new DrawableState(et1);
etstate2 = new DrawableState(et2);
etstate3 = new DrawableState(et3);
et1.setOnTouchListener(new View.OnTouchListener() {
#Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (DrawableClick.isDrawableClick(motionEvent, et1, DRAWABLE_RIGHT)) {
et1.setText("");
etstate1.refreshDrawable();
return true;
}
return false;
}
});
et2.setOnTouchListener(new View.OnTouchListener() {
#Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (DrawableClick.isDrawableClick(motionEvent, et2, DRAWABLE_RIGHT)) {
et2.setText("");
etstate2.refreshDrawable();
return true;
}
return false;
}
});
et3.setOnTouchListener(new View.OnTouchListener() {
#Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (DrawableClick.isDrawableClick(motionEvent, et3, DRAWABLE_RIGHT)) {
et3.setText("");
etstate3.refreshDrawable();
return true;
}
return false;
}
});
et1.addTextChangedListener(new TextWatcher() {
#Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
#Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
#Override
public void afterTextChanged(Editable editable) {
etstate1.refreshDrawable();
}
});
et2.addTextChangedListener(new TextWatcher() {
#Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
#Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
#Override
public void afterTextChanged(Editable editable) {
etstate2.refreshDrawable();
}
});
et3.addTextChangedListener(new TextWatcher() {
#Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
#Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
#Override
public void afterTextChanged(Editable editable) {
etstate3.refreshDrawable();
}
});
}
}
Helper classes:
public class DrawableClick {
public static boolean isDrawableClick(MotionEvent event, EditText editText, DrawablePositions drawablePosition) {
if (event.getAction() == MotionEvent.ACTION_UP) {
if (editText.getCompoundDrawables()[drawablePosition.position] != null && event.getX() >= (editText.getRight() - editText.getLeft() - editText.getCompoundDrawables()[drawablePosition.position].getBounds().width())) {
return true;
}
}
return false;
}
public enum DrawablePositions {
DRAWABLE_LEFT(0),
DRAWABLE_TOP(1),
DRAWABLE_RIGHT(2),
DRAWABLE_BOTTOM(3);
private int position;
DrawablePositions(int pos) {
this.position = pos;
}
}
}
Next:
public class DrawableState {
private EditText editText;
private Drawable[] editTextDrawables;
public DrawableState(EditText editText) {
this.editText = editText;
saveDrawableState();
refreshDrawable();
}
public void saveDrawableState() {
this.editTextDrawables = editText.getCompoundDrawables();
}
public void refreshDrawable() {
if (editText.getText().toString().equals("")) {
editText.setCompoundDrawables(null, null, null, null);
editText.clearFocus();
} else {
if (editTextDrawables != null) {
editText.setCompoundDrawables(editTextDrawables[0], editTextDrawables[1], editTextDrawables[2], editTextDrawables[3]);
}
}
}
I found the solution.
Change it
if (DrawableClick.isDrawableClick(motionEvent, et3, DRAWABLE_RIGHT)) {
...
return true;
}
return false;
To:
if (DrawableClick.isDrawableClick(motionEvent, et3, DRAWABLE_RIGHT)) {
...
motionEvent.setAction(MotionEvent.ACTION_CANCEL);
}
return false;

Android MaterialBetterSpinner change event

Im wondering, if I can set the event listener for a MaterialBetterSpinner when the selected item changes?
Something like that:
String [] TIPLIST = "Elektro","Oprema","Vodovod","Ogrevanje","Internet","Požarne naprave","Drugo"};
ArrayAdapter<String> arrayAdapterTip = new ArrayAdapter<String>(this,
android.R.layout.simple_dropdown_item_1line,TIPLIST);
MaterialBetterSpinner tipSpinner = (MaterialBetterSpinner)findViewById(spinnerTipNapake);
tipSpinner.setAdapter(arrayAdapterTip);
tipSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
//MaterialBetterSpinner changed
}
But it seems that MaterialBetterSpinner do not have setOnItemSelectedListener.
MaterialBetterSpinner do not have setOnItemSelectedListener.
Instead you can use this:
tipSpinner.addTextChangedListener(new TextWatcher() {
#Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
#Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
#Override
public void afterTextChanged(Editable s) {
spinnerValue=tipSpinner.getText().toString();
Log.i("value", spinnerValue);
}
});

AddTextChangedListener to Loop-generated EditText views

I'm new to Android development. I'm facing a dead end developing an app for a project. Please take some time and help me out.
The problem:
I am generating some EditText views nested in a LinearLayout using a for loop.
For example:
LinearLayout rootView = (LinearLayout) findViewById(R.id.rootview);
for (int i=0,j=10;i<j;i++) {
EditText et = new EditText(this);
rootView.addView(et);
et.setHint("EditText No. "+ i);
et.setId(i);
} // This code is for example purposes only.
Now, I can't seem to understand how I can set an addTextChangedListener on the EditText that is focused at a particular time and set that text on other EditTexts. Please tell me what approach should I adopt to achieve this. I tried my best to explain the problem; however, if there is still any ambiguity, feel free to comment and ask. I'm waiting for a solution to this problem.
In terms of screenshots:
What I have:
What I want:
I hope this clears things up!
**
EDIT:
Thanks to TylerSebastian for the solution. I got it to work. Here is the final code: (Inside OnCreate() method)
final LinearLayout rootView = (LinearLayout) findViewById(R.id.rootview);
for (int i=0,j=10;i<j;i++) {
final EditText et = new EditText(this);
rootView.addView(et);
et.setHint("EditText No. "+ i);
et.setId(i);
final TextWatcher textwatcher = new TextWatcher() {
#Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
#Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
#Override
public void afterTextChanged(final Editable s) {
for (int i=0;i<10;i++){
EditText view = (EditText) findViewById(i);
if (view != et){
view.setText(s.toString());
}
}
}
};
et.setOnFocusChangeListener(new View.OnFocusChangeListener() {
#Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
et.addTextChangedListener(textwatcher);
} else {
et.removeTextChangedListener(textwatcher);
}
}
});
}
**
I don't have access to a machine with AS on it atm so no guarantee that the following is bug-free, but this should point you in the right direction:
final LinearLayout rootLayout = ...;
// within your loop
et.addTextChangedListener(new TextWatcher() {
#Override
public void onTextChanged(CharSequence s, int start, int before, int count) {}
#Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
#Override
public void afterTextChanged(final Editable s) {
for (int i = 0; i < rootLayout.getChildCount(); i++) {
View view = rootLayout.getChildAt(i);
if (view instanceof EditText && view != et) {
((EditText) view).setText(s.toString());
}
}
}
});
edit: so the above will cause an infinite loop - see my comment below
How about:
final LinearLayout rootLayout = ...;
// again, within your loop
TextWatcher textWatcher = new TextWatcher() {
#Override
public void onTextChanged(CharSequence s, int start, int before, int count) {}
#Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
#Override
public void afterTextChanged(final Editable s) {
for (int i = 0; i < rootLayout.getChildCount(); i++) {
View view = rootLayout.getChildAt(i);
if (view instanceof EditText && view != et) {
((EditText) view).setText(s.toString());
}
}
}
};
et.setOnFocusChangeListener(new OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
((EditText) view).addTextChangedListener(textWatcher);
} else {
((EditText) view).removeTextChangedListener(textWatcher);
}
}
});
basically, only the focused element will have the textwatcher
first add a LinearLayout in your XML like that
<LinearLayout
android:id="#+id/linearLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" />
then create a new class
public class EditTextCust extends RelativeLayout {
EditText status;
public EditTextCust(Context context, Model post, int inputType,TextWatcher textWatcher) {
super(context);
inflate(context, R.layout.edit_text_cust, this);
status = (EditText) findViewById(R.id.editText);
status.setInputType(inputType);
post.setData(status.getText().toString());
status.setHint(post.getHint());
status.addTextChangedListener(textWatcher);
}
public String getText() {
return status.getText().toString();
}
public EditTextCust(Context context, AttributeSet attrs) {
super(context, attrs);
}
public EditTextCust(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
}
and creat new XML file names edit_text_cust for this custom view class
<EditText
android:id="#+id/dateEditText"
android:layout_width="match_parent"
android:background="#android:color/transparent"
android:padding="#dimen/_5sdp"
android:layout_height="match_parent"
android:textSize="#dimen/_12sdp" />
and creat model class to set your data
public class Model {
String hint;
String id;
String data;
public String getHint() {
return hint;
}
public void setHint(String hint) {
this.hint = hint;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
and in your class inside the for loop but this code
Model model = new Model();
model.setHint("HINT");
model.setId("1");
editTextCust = new EditTextCust(this, editTextCustModel, InputType.TYPE_CLASS_NUMBER, new TextWatcher() {
#Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
#Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// getText from here use
s.toString();
}
#Override
public void afterTextChanged(Editable s) {
}
});
linearLayout.addView(editTextCust);
it's work with me correctly, and if you didn't understand any thing from this code just add comment and i will help you :)

Categories

Resources