Set edittext input to password in fragment. (programatically) - android

I got problem with setting EditText to password input type.
I try all stuff from stackoverflow, but nothing works when my EditText is in Fragment.
passBox.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_PASSWORD);
passBox.setTransformationMethod(PasswordTransformationMethod.getInstance());
Try both of this and together in any combinations.
public void setViews(Context activity)
{
...
passBox = new EditText(activity);
passBox.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_PASSWORD);
passBox.setTransformationMethod(PasswordTransformationMethod.getInstance());
}
In activity:
cFragment confFrag = new cFragment();
confFrag.setViews(this);
...
confFrag.passBox.setText(settings.getString(PASS, DEFAULT_PASS));
ANSWER:
passBox.setTransformationMethod(PasswordTransformationMethod.getInstance());
Must be called after adding EditText to other Views.
passBox.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
Remove hints, so it is usefull too. Anywhere before transformationMethod.

Try calling the setViews after the onCreateView method from the fragment is done and for the EditText it is enough to use: text.setTransformationMethod(PasswordTransformationMethod.getInstance()); .

try this
passBox.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

Related

EditText Clear Text with click(Xamarin)

Hi i'm using this code when user click on an edittext to clear it.
The Problem is that it doesnt work properly.I mean that i must click my EditText two times for clear it. In first click it opens Keyboard and in second click, it runs my code:
Here is my code:
var comments = FindViewById<EditText>(Resource.Id.txtExtrasComment);
comments.Click+=delegate
{
comments.Text = "";
};
How Can i fix this?
I found my answer with another way. i just added in my edittext
android:hint="comments..."
if you want edit in .cs file you use in onCreate()
...
editText.setOnClickListener(this);
...
public void onClick(View v)
{
editText.setText("");
}
other way in .cs
editText.getText().clear();
if you want edit axml page, you use placeholder properties. You have wrote already up.
android:hint="Enter number"
Try this:
From the forum
You can use a onTouchListener on the edittext to clear the data inside it.
myEditText.Click += (sender, eventArgs) => {
// do my business
// Add the line below
(sender as EditText).OnTouchEvent(eventArgs.Event);
};

Binding several views to a Listener with multiple methods in Butterknife

I'm using Butterknife(8.4.0) to instantiate my views in a fragment that has several EditTexts.
I'm using these EditTexts to set a string to a specific Model attribute. I don't want to create loads of bind methods for each Edittext so on #onTextChanged I pass in all the edit texts. I'm only interested in AfterTextChanged() so I've also passed that in. I then use the editText ids to specify which model attribute should be set.
#BindView(R.id.edit_text_one) EditText textFieldOne;
#BindView(R.id.edit_text_two) EditText textFieldTwo;
#OnTextChanged(value = {R.id.edit_text_one, R.id.edit_text_two}, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED)
void setEditTextFields(EditText editText, Editable editable) {
switch (editText.getId()) {
case R.id.edit_text_one:
myModel.setStringOne(editable.toString());
break;
case R.id.edit_text_two:
myModel.setStringTwo(editable.toString());
break;
}
}
However I'm getting a compile error
Error:(117, 10) error: #OnTextChanged methods can have at most 1 parameter(s). (com.skeeno.android.gamecabinet.Fragment.EditorFragment.setEditTextFields)
I've read here that you just pass in the view as the first argument but that doesn't seem to work since AfterTextChanged is only expecting an editable.
Is there a way to do this?
Any help will be greatly appreciated. Thanks.
Passing View with #onTextChanged is not possible currently. I tried too.
However, below code can be used to get the current view,
//Inside a fragment
View view = getActivity().getCurrentFocus();
Hope this helped.
It is a little bit late but if anyone will have this issue, answer can be helpful therefore, here how i make it work. You cannot send two parameter method for AFTER_TEXT_CHANGED therefore; you need to change method void setEditTextFields(EditText editText, Editable editable) to void setEditTextFields(Editable editable). In this case you need to write #OnTextChanged for all EditText you want to listen.
Here is final code should be;
#BindView(R.id.edit_text_one) EditText textFieldOne;
#BindView(R.id.edit_text_two) EditText textFieldTwo;
#OnTextChanged(value =R.id.edit_text_one, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED)
void edit_text_oneChanged(Editable editable) {
myModel.setStringOne(editable.toString());
}
#OnTextChanged(value =R.id.edit_text_two, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED)
void edit_text_twoChanged(Editable editable) {
myModel.setStringTwo(editable.toString());
}

Cannot change EditText back to being editable

I want to make my EditText not Editable through java code, and then get it back to being editable, but it seems that it cannot be changed back.
noteDetailsview.setClickable(false);
noteDetailsview.setFocusable(false);
noteDetailsview.setClickable(true);
noteDetailsview.setFocusable(true);
Now it is still not editable. How can I make it editable again.
Try with this to make eddittext not editable:
noteDetailsview.setEnabled(false);
and this to make it editable again:
noteDetailsview.setEnabled(true);
use noteDetailview.setEnable(true/false) to enable/disable the edittext.
you can use these methods:
public void getFocous(EditText edit) {
edit.setFocusable(true);
edit.setFocusableInTouchMode(true);
edit.requestFocus();
edit.requestFocusFromTouch();
}
public void loseFocous(EditText edit) {
edit.clearFocus();
edit.setFocusable(false);
}

setHint doesnt work with setInputType

I build EditText dynamically. Among other things, I set 2 properties: hint(.setHint) and inputType(.setInputType). My problem: when I invoke setInputType, setHint has no effect: blank edittexts remain blank with no hint. Once I comment out setInputType, I see all hints. I need both input type and hint. What to do? My code:
private EditText buildTextBox(Property property)
{
EditText control = new EditText(this);
control.setInputType(getInputTypeByPropertyInputType(property.getType()));// android.text.InputType.
control.setHint(property.getDisplayName());
return control;
}
private int getInputTypeByPropertyInputType(String type)
{
if (type.equals("integer"))
{
return android.text.InputType.TYPE_CLASS_NUMBER;
}
else
{
return android.text.InputType.TYPE_CLASS_TEXT;
}
}
#Eugene
Ensure you call control.SetHint() just before you call the control.setGravity() and control.setInputType(); and it works for me verrry much!
column1 = new EditText(this);
column1.setId(i);
column1.setHint("Value");
column1.setInputType(InputType.TYPE_CLASS_NUMBER);
column1.setGravity(Gravity.RIGHT);
I agree with Eugene.
Remove the gravity(just don't use CENTER) and the hint texts will come back as normal.
Nice find!

How to remove focus without setting focus to another control?

I like my UIs to be intuitive; each screen should naturally and unobtrusively guide the user on to the next step in the app. Barring that, I strive to make things as confusing and confounding as possible.
Just kidding :-)
I've got three TableRows, each containing a read-only and non-focusable EditText control and then a button to its right. Each button starts the same activity but with a different argument. The user makes a selection there and the sub-activity finishes, populating the appropriate EditText with the user's selection.
It's the classic cascading values mechanism; each selection narrows the available options for the next selection, etc. Thus I'm disabling both controls on each of the next rows until the EditText on the current row contains a value.
I need to do one of two things, in this order of preference:
When a button is clicked, immediately remove focus without setting focus to a different button
Set focus to the first button when the activity starts
The problem manifests after the sub-activity returns; the button that was clicked retains focus.
Re: #1 above - There doesn't appear to be a removeFocus() method, or something similar
Re: #2 above - I can use requestFocus() to set focus to the button on the next row, and that works after the sub-activity returns, but for some reason it doesn't work in the parent activity's onCreate().
I need UI consistency in either direction--either no buttons have focus after the sub-activity finishes or each button receives focus depending on its place in the logic flow, including the very first (and only) active button prior to any selection.
Using clearFocus() didn't seem to be working for me either as you found (saw in comments to another answer), but what worked for me in the end was adding:
<LinearLayout
android:id="#+id/my_layout"
android:focusable="true"
android:focusableInTouchMode="true" ...>
to my very top level Layout View (a linear layout). To remove focus from all Buttons/EditTexts etc, you can then just do
LinearLayout myLayout = (LinearLayout) activity.findViewById(R.id.my_layout);
myLayout.requestFocus();
Requesting focus did nothing unless I set the view to be focusable.
Old question, but I came across it when I had a similar issue and thought I'd share what I ended up doing.
The view that gained focus was different each time so I used the very generic:
View current = getCurrentFocus();
if (current != null) current.clearFocus();
You can use View.clearFocus().
Use View.requestFocus() called from onResume().
android:descendantFocusability="beforeDescendants"
using the following in the activity with some layout options below seemed to work as desired.
getWindow().getDecorView().findViewById(android.R.id.content).clearFocus();
in connection with the following parameters on the root view.
<?xml
android:focusable="true"
android:focusableInTouchMode="true"
android:descendantFocusability="beforeDescendants" />
https://developer.android.com/reference/android/view/ViewGroup#attr_android:descendantFocusability
Answer thanks to:
https://forums.xamarin.com/discussion/1856/how-to-disable-auto-focus-on-edit-text
About windowSoftInputMode
There's yet another point of contention to be aware of. By default,
Android will automatically assign initial focus to the first EditText
or focusable control in your Activity. It naturally follows that the
InputMethod (typically the soft keyboard) will respond to the focus
event by showing itself. The windowSoftInputMode attribute in
AndroidManifest.xml, when set to stateAlwaysHidden, instructs the
keyboard to ignore this automatically-assigned initial focus.
<activity
android:name=".MyActivity"
android:windowSoftInputMode="stateAlwaysHidden"/>
great reference
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="#+id/ll_root_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
LinearLayout llRootView = findViewBindId(R.id.ll_root_view);
llRootView.clearFocus();
I use this when already finished update profile info and remove all focus from EditText in my layout
====> Update: In parent layout content my EditText add line:
android:focusableInTouchMode="true"
What about just adding android:windowSoftInputMode="stateHidden" on your activity in the manifest.
Taken from a smart man commenting on this: https://stackoverflow.com/a/2059394/956975
I tried to disable and enable focusability for view and it worked for me (focus was reset):
focusedView.setFocusable(false);
focusedView.setFocusableInTouchMode(false);
focusedView.setFocusable(true);
focusedView.setFocusableInTouchMode(true);
First of all, it will 100% work........
Create onResume() method.
Inside this onResume() find the view which is focusing again and again by findViewById().
Inside this onResume() set requestFocus() to this view.
Inside this onResume() set clearFocus to this view.
Go in xml of same layout and find that top view which you want to be focused and set focusable true and focusableInTuch true.
Inside this onResume() find the above top view by findViewById
Inside this onResume() set requestFocus() to this view at the last.
And now enjoy......
android:focusableInTouchMode="true"
android:focusable="true"
android:clickable="true"
Add them to your ViewGroup that includes your EditTextView.
It works properly to my Constraint Layout. Hope this help
You could try turning off the main Activity's ability to save its state (thus making it forget what control had text and what had focus). You will need to have some other way of remembering what your EditText's have and repopulating them onResume(). Launch your sub-Activities with startActivityForResult() and create an onActivityResult() handler in your main Activity that will update the EditText's correctly. This way you can set the proper button you want focused onResume() at the same time you repopulate the EditText's by using a myButton.post(new Runnable(){ run() { myButton.requestFocus(); } });
The View.post() method is useful for setting focus initially because that runnable will be executed after the window is created and things settle down, allowing the focus mechanism to function properly by that time. Trying to set focus during onCreate/Start/Resume() usually has issues, I've found.
Please note this is pseudo-code and non-tested, but it's a possible direction you could try.
You do not need to clear focus, just add this code where you want to focus
time_statusTV.setFocusable(true);
time_statusTV.requestFocus();
InputMethodManager imm = (InputMethodManager)this.getSystemService(Service.INPUT_METHOD_SERVICE);
imm.showSoftInput( time_statusTV, 0);
Try the following (calling clearAllEditTextFocuses();)
private final boolean clearAllEditTextFocuses() {
View v = getCurrentFocus();
if(v instanceof EditText) {
final FocusedEditTextItems list = new FocusedEditTextItems();
list.addAndClearFocus((EditText) v);
//Focus von allen EditTexten entfernen
boolean repeat = true;
do {
v = getCurrentFocus();
if(v instanceof EditText) {
if(list.containsView(v))
repeat = false;
else list.addAndClearFocus((EditText) v);
} else repeat = false;
} while(repeat);
final boolean result = !(v instanceof EditText);
//Focus wieder setzen
list.reset();
return result;
} else return false;
}
private final static class FocusedEditTextItem {
private final boolean focusable;
private final boolean focusableInTouchMode;
#NonNull
private final EditText editText;
private FocusedEditTextItem(final #NonNull EditText v) {
editText = v;
focusable = v.isFocusable();
focusableInTouchMode = v.isFocusableInTouchMode();
}
private final void clearFocus() {
if(focusable)
editText.setFocusable(false);
if(focusableInTouchMode)
editText.setFocusableInTouchMode(false);
editText.clearFocus();
}
private final void reset() {
if(focusable)
editText.setFocusable(true);
if(focusableInTouchMode)
editText.setFocusableInTouchMode(true);
}
}
private final static class FocusedEditTextItems extends ArrayList<FocusedEditTextItem> {
private final void addAndClearFocus(final #NonNull EditText v) {
final FocusedEditTextItem item = new FocusedEditTextItem(v);
add(item);
item.clearFocus();
}
private final boolean containsView(final #NonNull View v) {
boolean result = false;
for(FocusedEditTextItem item: this) {
if(item.editText == v) {
result = true;
break;
}
}
return result;
}
private final void reset() {
for(FocusedEditTextItem item: this)
item.reset();
}
}

Categories

Resources