Почти всегда плохой идеей использовать функцию fscanf()
, поскольку она может оставить указатель файла в неизвестном месте при ошибке.
Я предпочитаю использовать fgets()
, чтобы получить каждую строку, а затем sscanf()
, что. Затем вы можете продолжить изучение строки, считанной, по вашему усмотрению. Что-то вроде:
#define LINESZ 1024
char buff[LINESZ];
FILE *fin = fopen ("infile.txt", "r");
if (fin != NULL) {
while (fgets (buff, LINESZ, fin)) {
/* Process buff here. */
}
fclose (fin);
}
fgets()
похоже на то, что вы пытаетесь сделать, читаете строку, пока не встретите символ новой строки.
Все решения, приведенные выше ( InputMethodManager , взаимодействие в OnFocusChangeListener.onFocusChange , подключенный к вашему EditText , работает нормально, если у вас есть одно редактирование в действии.
]В моем случае у меня есть две правки.
private EditText tvX, tvY;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tvX.setOnFocusChangeListener(this);
tvY.setOnFocusChangeListener(this);
@Override
public void onFocusChange(View v, boolean hasFocus) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if(tvX.hasFocus() || tvY.hasFocus()) {
imm.showSoftInput(v, 0);
} else {
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
};
Я заметил, что onFocusChange запускается для tvX с hasFocus = true (клавиатура показана), но затем для tvY с hasFocus = true (клавиатура скрыта) В конце концов, клавиатура не была видна.
Общее решение должно иметь правильную формулировку, если «показать клавиатуру, если текст EditText имеет фокус»
Верьте или нет, моя проблема с Soft Keyboard была решена, когда я обнаружил, что анимация Activity может отключить Soft Keyboard. Когда вы вызываете намерение с помощью
i.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
и
overridePendingTransition(0, 0);
, оно может скрыть программную клавиатуру, и нет способа показать это.
вызовите метод requestFocus () для editText в методе Activity () onCrete () и вызовите метод clearFocus () для того же editText при нажатии, выполненном на клавиатуре.
Чтобы вызвать появление клавиатуры, используйте
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
Этот метод более надежен, чем прямой вызов InputMethodManager.
Чтобы закрыть его, используйте
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
Чтобы скрыть клавиатуру, используйте эту:
getActivity().getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
и чтобы показать клавиатуру:
getActivity().getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
Kotlin
расширение для показа клавиатуры на фокусе.
Это - комбинация предыдущих ответов, который где или слишком длинный или неполный.
Это расширение отправляет выполнимое на очереди сообщений, которая показывает программируемую клавиатуру после запроса фокуса:
fun View.showSoftKeyboard() {
post {
if (this.requestFocus()) {
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}
}
}
Вызов это от любого представления при необходимости впоследствии:
editText.showSoftKeyboard()
Просто добавьте эту строку в своем представлении EditText:
android:isScrollContainer="true"
и TADA - клавиатура начала обнаруживаться автоматически!
я имел подобную проблему и обнаружил это простое и странное решение.
Как уже был упомянут здесь user3392439, появлением клавиатуры на фокус, так или иначе странно соединенный с присутствием компонента прокрутки в XML-файле.
Даже присутствие другой представление EditText, которое включает вышеупомянутую строку в том же XML, заставляет клавиатуру появиться, неважно, какой из EditTexts в настоящее время фокусируется.
, Если у Вас есть по крайней мере один видимый представление, включающее компонент прокрутки в Вашем XML-файле - клавиатура появится автоматически на фокусе.
, Если никакая прокрутка - затем необходимо нажать на EditText, чтобы заставить клавиатуру появиться.
Согласно этот ответ я использовал setSoftInputMode метод и overrided эти методы в DialogFragment:
@Override
public void onCancel(@NonNull DialogInterface dialog) {
super.onCancel(dialog);
requireDialog().getWindow().setSoftInputMode(InputMethodManager.HIDE_IMPLICIT_ONLY);
}
@Override
public void onStart() {
super.onStart();
requireDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
@Override
public void onStop() {
super.onStop();
requireDialog().getWindow().setSoftInputMode(InputMethodManager.HIDE_IMPLICIT_ONLY);
}
я также сделал свой собственный подкласс DialogFragment с этими методами, поэтому когда Вы создаете другое диалоговое окно и наследовались этому классу, у Вас есть программируемая клавиатура, показал автоматически без любых других редактирований. Надежда это будет полезно для кого-то.