Остановите EditText от получения фокуса при запуске Activity

Я рекомендовал использовать этот скрипт, чтобы получить реальный размер.

db.users.find().forEach(function(obj)
{
  var size = Object.bsonsize(obj);
  print('_id: '+obj._id+' || Size: '+size+'B -> '+Math.round(size/(1024))+'KB -> '+Math.round(size/(1024*1024))+'MB (max 16MB)');
});

Примечание. Если ваши идентификаторы являются 64-битными целыми числами, вышесказанное усечет значение идентификатора при печати! Если это так, вы можете использовать вместо этого:

db.users.find().forEach(function(obj)
{
  var size = Object.bsonsize(obj);
  var stats =
  {
    '_id': obj._id, 
    'bytes': size, 
    'KB': Math.round(size/(1024)), 
    'MB': Math.round(size/(1024*1024))
  };
  print(stats);
});

Это также имеет преимущество возврата JSON, поэтому графический интерфейс, подобный RoboMongo, может его табулировать!

source: https://stackoverflow.com/a/16957505/3933634

edit: благодаря @zAlbee для вашего предложения.

2726
задан Pankaj Lilan 25 December 2017 в 09:49
поделиться

7 ответов

Отличные ответы Люка и Марка, однако хороший образец кода отсутствует. Добавление тега android: focusableInTouchMode = "true" в , как в следующем примере, устранит проблему.

<!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
<LinearLayout
    android:focusable="true" 
    android:focusableInTouchMode="true"
    android:layout_width="0px" 
    android:layout_height="0px"/>

<!-- :nextFocusUp and :nextFocusLeft have been set to the id of this component
to prevent the dummy from receiving focus again -->
<AutoCompleteTextView android:id="@+id/autotext"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:nextFocusUp="@id/autotext" 
    android:nextFocusLeft="@id/autotext"/>
2488
ответ дан 22 November 2019 в 19:51
поделиться

Попробуйте clearFocus () вместо setSelected (false) . Каждое представление в Android имеет как фокусировку, так и возможность выбора, и я думаю, что вам нужно просто убрать фокус.

69
ответ дан 22 November 2019 в 19:51
поделиться

Единственное решение, которое я нашел:

  • Создайте LinearLayout (я не знаю, будут ли работать другие типы макетов)
  • Установите атрибуты android: focusable = "true" и android: focusableInTouchMode = "true"

И EditText не получит фокус после запуска действия

418
ответ дан 22 November 2019 в 19:51
поделиться

Да, я сделал то же самое - создал «фиктивный» линейный макет, который получает начальный фокус. Кроме того, я установил идентификаторы «следующего» фокуса, чтобы пользователь больше не мог сфокусировать его после прокрутки один раз:

<LinearLayout 'dummy'>
<EditText et>

dummy.setNextFocusDownId(et.getId());

dummy.setNextFocusUpId(et.getId());

et.setNextFocusUpId(et.getId());

много работы, чтобы просто избавиться от фокуса на представлении ..

Спасибо

13
ответ дан 22 November 2019 в 19:51
поделиться

Действительно ли проблема в том, что вы просто не хотите, чтобы она вообще фокусировалась? Или вы не хотите, чтобы виртуальная клавиатура отображалась в результате фокусировки EditText ? Я действительно не вижу проблемы с EditText , имеющим фокус при запуске, но это определенно проблема, когда окно softInput открыто, когда пользователь явно не запрашивал фокусировку на EditText ] (и в результате откроем клавиатуру).

Если проблема связана с виртуальной клавиатурой, см. Документацию AndroidManifest.xml element .

android: windowSoftInputMode = "stateHidden" - всегда скрывать при входе в активность.

или android: windowSoftInputMode = "stateUnchanged" - не меняйте его (например, не показывать его, если он еще не отображается, но если он был открыт, когда входя в действие, оставьте его открытым).

1648
ответ дан 22 November 2019 в 19:51
поделиться

Я очищаю весь фокус с кнопка отправки

// xml file
<LinearLayout
...
android:id="@+id/linear_layout"
android:focusableInTouchMode="true"> // 1. make this focusableInTouchMode...
</LinearLayout>

// Activity file
private LinearLayout mLinearLayout; // 2. parent layout element
private Button mButton;

mLinearLayout = findViewById(R.id.linear_layout);
mButton = findViewById(R.id.button);

  mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mLinearLayout.requestFocus(); // 3. request focus

            }
        });

, я надеюсь, что это помогает Вам:)

0
ответ дан 22 November 2019 в 19:51
поделиться

Простое и надежное решение, просто переопределите этот метод:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    View v = getCurrentFocus();

    if (v != null &&
            (ev.getAction() == MotionEvent.ACTION_UP || ev.getAction() == MotionEvent.ACTION_MOVE) &&
            v instanceof EditText &&
            !v.getClass().getName().startsWith("android.webkit.")) {
        int scrcoords[] = new int[2];
        v.getLocationOnScreen(scrcoords);
        float x = ev.getRawX() + v.getLeft() - scrcoords[0];
        float y = ev.getRawY() + v.getTop() - scrcoords[1];

        if (x < v.getLeft() || x > v.getRight() || y < v.getTop() || y > v.getBottom())
            hideKeyboard(this);
    }
    return super.dispatchTouchEvent(ev);
}

public static void hideKeyboard(Activity activity) {
    if (activity != null && activity.getWindow() != null && activity.getWindow().getDecorView() != null) {
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(activity.getWindow().getDecorView().getWindowToken(), 0);
    }
}
0
ответ дан 22 November 2019 в 19:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: