Ответ 1
проверить этот вопрос и выбранный ответ: Остановить EditText от получения фокуса при запуске Activity Это уродливо, но он работает, и насколько я знаю, нет лучшего решения.
В моем приложении у меня есть один EditText
вместе с некоторыми TextViews
, кнопка и спиннер. Я считаю, что мой EditText получает фокус, поскольку это единственный фокусируемый вид в этом упражнении. Мой EditText
отображается с оранжевой рамкой и курсором на поле.
Теперь я хотел бы убрать фокус из этого поля (я не хочу, чтобы курсор и граница отображались). Есть ли способ сделать это?
Я смог сосредоточиться на кнопке, выполнив button.seFocusableInTouchMode()
и button.requestFocus()
. Но это выдвигает на первый план кнопку и, очевидно, не то, что я хочу.
проверить этот вопрос и выбранный ответ: Остановить EditText от получения фокуса при запуске Activity Это уродливо, но он работает, и насколько я знаю, нет лучшего решения.
Вы пытались использовать старый добрый View.clearFocus()
плохо знаком с андроидом.. попробовал
getWindow().getDecorView().clearFocus();
это работает для меня..
просто добавить.. ваш макет должен иметь:
android:focusable="true"
android:focusableInTouchMode="true"
Я попытаюсь объяснить, как удалить фокус (мигающий курсор) из режима EditText с некоторыми подробностями и пониманием. Обычно эта строка кода должна работать
editText.clearFocus()
но это может быть ситуация, когда у editText все еще есть фокус, и это происходит потому, что метод clearFocus() пытается вернуть фокус в первый фокусный вид в макете действий/фрагментов,
Итак, если у вас есть только один вид в активности, который является настраиваемым, и обычно это будет ваше представление EditText, то clearFocus() снова установит фокус для этого вида, и для вас будет выглядеть, что clearFocus() не работает. Помните, что представления EditText являются настраиваемыми (true) по умолчанию, поэтому, если у вас есть только один вид EditText внутри вашего макета, он всегда будет фокусироваться на экране. В этом случае ваше решение будет состоять в том, чтобы найти родительский вид (некоторый макет, ex LinearLayout, Framelayout) внутри вашего файла макета и установить ему этот xml-код
android:focusable="true"
android:focusableInTouchMode="true"
После этого, когда вы выполните editText.clearFocus(), родительский вид внутри вашего макета примет фокус, и ваш editText будет очищен от фокуса.
Надеюсь, это поможет кому-то понять, как работает clearFocus().
Я знаю, что слишком поздно, но для кого-то есть такая же потребность editText.setFocusable(false) si, что вы ищете.
Используйте прилагаемый код, чтобы придать фокусу "кому-то еще", это нормально, если у вас есть представление, в котором вы просто хотите убрать клавиатуру и освободить фокус, вам все равно, кто ее получит.
Используйте следующее: FocusHelper.releaseFocus(viewToReleaseFocusFrom)
public class FocusHelper {
public static void releaseFocus(View view) {
ViewParent parent = view.getParent();
ViewGroup group = null;
View child = null;
while (parent != null) {
if (parent instanceof ViewGroup) {
group = (ViewGroup) parent;
for (int i = 0; i < group.getChildCount(); i++) {
child = group.getChildAt(i);
if(child != view && child.isFocusable())
child.requestFocus();
}
}
parent = parent.getParent();
}
}
}
Doc: Метод перемещается из дочернего представления и вверх по дереву представления и ищет первого ребенка, на который нужно сосредоточиться.
Изменить: Вы также можете использовать API для этого:
View focusableView = v.focusSearch(View.FOCUS_DOWN);
if(focusableView != null) focusableView.requestFocus();
У меня была аналогичная проблема с editText, которая сфокусировалась с момента запуска этой операции. эту проблему я легко фиксировал следующим образом:
вы добавляете этот фрагмент кода в макет, содержащий editText в xml:
android:id="@+id/linearlayout"
android:focusableInTouchMode="true"
Не забывайте android:id
, без него у меня есть ошибка.
Другая проблема, с которой я столкнулся с editText, заключается в том, что, когда он получает первый фокус, фокус никогда не исчезает. это часть моего кода в java, у него есть editText и кнопка, которая захватывает текст в editText:
editText=(EditText) findViewById(R.id.et1);
tvhome= (TextView)findViewById(R.id.tv_home);
etBtn= (Button) findViewById(R.id.btn_homeadd);
etBtn.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
tvhome.setText( editText.getText().toString() );
//** this code is for hiding the keyboard after pressing the button
View view = Settings.this.getCurrentFocus();
if (view != null)
{
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
//**
editText.getText().clear();//clears the text
editText.setFocusable(false);//disables the focus of the editText
Log.i("onCreate().Button.onClickListener()", "et.isfocused= "+editText.isFocused());
}
});
editText.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
if(v.getId() == R.id.et1)
{
v.setFocusableInTouchMode(true);// when the editText is clicked it will gain focus again
//** this code is for enabling the keyboard at the first click on the editText
if(v.isFocused())//the code is optional, because at the second click the keyboard shows by itself
{
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);
}
//**
Log.i("onCreate().EditText.onClickListener()", "et.isfocused= "+v.isFocused());
}
else
Log.i("onCreate().EditText.onClickListener()", "the listener did'nt consume the event");
}
});
надеюсь, что это поможет некоторым из вас!
Просто найдите другое представление и сосредоточьте его внимание.
var refresher = FindViewById<MvxSwipeRefreshLayout>(Resource.Id.refresher);
refresher.RequestFocus();
если родительский макет Edittext
является Linear
то добавьте
android:focusable="true"
android:focusableInTouchMode="true"
как ниже
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:focusable="true"
android:focusableInTouchMode="true">
<EditText/>
............
когда родительский макет Edittext является относительным, то
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"
лайк
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true">
<EditText/>
............
Я очень старался очистить фокус от текста редактирования. clearfocus() и фокусируемая, и другие вещи никогда не работали для меня. Таким образом, я придумал идею о том, чтобы дать фокусному фокусу фокуса:
<LinearLayout
...
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
...
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--here comes your stuff-->
</LinearLayout>
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/fake"
android:textSize="1sp"/>
</LinearLayout>
то в вашем java-коде:
View view = Activity.this.getCurrentFocus();
if (view != null) {
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
fake.requestFocus();
}
он скроет клавиатуру и удалит фокус любого edittext, который имеет его. а также, поскольку вы видите, что фальшивый edittext вышел из экрана и не может быть замечен
Просто включите эту строку
android:selectAllOnFocus="false"
в сегменте XML, соответствующем макету EditText.
Если я правильно понимаю ваш вопрос, это должно помочь вам:
TextView tv1 = (TextView) findViewById(R.id.tv1);
tv1 .setFocusable(false);
Вам просто нужно очистить фокус от представления в виде
EditText.clearFocus()
Поскольку я был в виджетах, а не в активности, которую я сделал:
`getRootView() clearFocus();.
<EditText android:layout_height="wrap_content" android:background="@android:color/transparent" android:layout_width="match_parent"
android:clickable="false"
android:focusable="false"
android:textSize="40dp"
android:textAlignment="center"
android:textStyle="bold"
android:textAppearance="@style/Base.Theme.AppCompat.Light.DarkActionBar"
android:text="AVIATORS"/>
Вам нужно только установить ViewGroup с атрибутом:
android:focusableInTouchMode="true"
ViewGroup - это макет, включающий все дочерние представления.