Android: показывать подсказку в блесне перед тем, как щелкнуть любой элемент
Моя программа заключается в разработке прядильщика с подсказкой "Введение" перед тем, как щелкнуть стрелку прядильщика, чтобы выбрать элементы. Когда я нажимаю на стрелку, появится выпадающее меню с несколькими элементами, но подсказка не нужна. слово, которое будет отображаться как один из пунктов раскрывающегося меню. И когда я щелкаю один из предметов внутри счетчика, он приводит меня к соответствующему фрагменту.
Моя программа может работать без сбоев, прежде чем я добавлю подсказку. Однако после того, как я пересмотрю свои коды с помощью функции подсказки, я больше не могу запускать ее ожидаемым образом.......
Моя программа до сих пор может показывать первый макет при запуске, но он умирает каждый раз, когда я нажимаю на стрелку счетчика, показывая "приложение остановлено". (в моей программе нет сообщений об ошибках, но есть некоторые подсказки в logcat и run, я пытаюсь их прочитать, но все равно не понимаю)
моя редакция подсказки основана на этих сайтах:
Как сделать Android Spinner с начальным текстом "Select One"
https://android--code.blogspot.tw/2015/08/android-spinner-hint.html
и некоторые другие сайты, но большинство из них довольно сложны для новичка, как я, чтобы пересмотреть, чтобы соответствовать моим потребностям. Большое спасибо за помощь мне><
MainActivity.java: пакет com.example.ellen.spinnercontent;
import android.graphics.Color;
import android.support.v4.app.FragmentTransaction;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Get reference of widgets from XML layout
final Spinner sp = findViewById(R.id.spi);
// ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.ar.planets_array, android.R.layout.simple_spinner_item);
// adapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
// sp.setPrompt("Introduction");
// Initialize a String Array
final String[] section = {
"Introduction",
"Slide design",
"Slide written content",
"Introduction language",
"Body language",
"Full example of a good introduction",
};
// Initializing an ArrayAdapter with the string section
final ArrayAdapter<String> ar = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, section){
@Override
public boolean isEnabled(int position){
if(position == 0)
{
// Disable the first item(hint) from Spinner
return false;
}
else
{
return true;
}
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent)
{
View view = super.getDropDownView(position, convertView, parent);
TextView tv = (TextView) view;
if(position == 0){
// Set the hint text color gray
tv.setTextColor(Color.GRAY);
}
else {
tv.setTextColor(Color.BLACK);
}
return view;
}
};
ar.setDropDownViewResource(R.layout.spinner_item);//added
sp.setAdapter(ar);
sp.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
{
private void changeFragment(Fragment fragment) {
FragmentTransaction ta = getSupportFragmentManager().beginTransaction();
ta.replace(R.id.root, fragment);
ta.addToBackStack(null);
ta.commit();
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
{
String s = (String) parent.getItemAtPosition(position);
if(position > 0)
{
if (s.equals("Slide design"))
changeFragment(new FragmentOne());
if (s.equals("Slide written content"))
changeFragment(new FragmentTwo());
if (s.equals("Introduction language"))
changeFragment(new FragmentThree());
if (s.equals("Body language"))
changeFragment(new FragmentFour());
if (s.equals("Full example of a good introduction"))
changeFragment(new FragmentFive());
}
}
public void onNothingSelected(AdapterView<?> arg0) {
}
});
}
}
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.ellen.spinnercontent.MainActivity">
<Spinner
android:id="@+id/spi"
android:textSize="26sp"
android:textStyle="normal|bold"
android:ellipsize="marquee"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:paddingStart="8dip"
android:paddingLeft="8dip"
android:paddingRight="8dip"
android:singleLine="true"
android:textColor="#8B008B"
/>
<RelativeLayout
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools"
android:padding="10dp"
tools:context=".MainActivity"
android:background="#fbdfed"
/>
</LinearLayout>
spinner_item.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.ellen.spinnercontent.MainActivity">
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:textStyle="italic"
/>
</LinearLayout>
бежать:
04/18 19:07:09: Launching app
$ adb push /Users/ellen/Desktop/my-spinner/spinnerContent/app/build/outputs/apk/debug/app-debug.apk /data/local/tmp/com.example.ellen.spinnercontent
$ adb shell pm install -t -r "/data/local/tmp/com.example.ellen.spinnercontent"
Success
$ adb shell am start -n "com.example.ellen.spinnercontent/com.example.ellen.spinnercontent.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
Client not ready yet..Waiting for process to come online
Connected to process 3477 on device emulator-5554
Capturing and displaying logcat messages from application. This behavior can be disabled in the "Logcat output" section of the "Debugger" settings page.
W/System: ClassLoader referenced unknown path: /data/app/com.example.ellen.spinnercontent-1/lib/x86
W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
I/OpenGLRenderer: Initialized EGL, version 1.4
D/OpenGLRenderer: Swap behavior 1
W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
D/OpenGLRenderer: Swap behavior 0
D/EGL_emulation: eglCreateContext: 0xa07050c0: maj 2 min 0 rcv 2
D/EGL_emulation: eglMakeCurrent: 0xa07050c0: ver 2 0 (tinfo 0xa07036c0)
D/EGL_emulation: eglMakeCurrent: 0xa07050c0: ver 2 0 (tinfo 0xa07036c0)
E/ArrayAdapter: You must supply a resource ID for a TextView
D/AndroidRuntime: Shutting down VM
--------- beginning of crash
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.ellen.spinnercontent, PID: 3477
java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView
at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:401)
at android.widget.ArrayAdapter.getDropDownView(ArrayAdapter.java:457)
at com.example.ellen.spinnercontent.MainActivity$1.getDropDownView(MainActivity.java:75)
at android.widget.Spinner$DropDownAdapter.getDropDownView(Spinner.java:975)
at android.widget.Spinner$DropDownAdapter.getView(Spinner.java:971)
at android.widget.Spinner.measureContentWidth(Spinner.java:845)
at android.widget.Spinner$DropdownPopup.computeContentWidth(Spinner.java:1206)
at android.widget.Spinner$DropdownPopup.show(Spinner.java:1232)
at android.widget.Spinner.performClick(Spinner.java:770)
at android.support.v7.widget.AppCompatSpinner.performClick(AppCompatSpinner.java:448)
at android.view.View$PerformClick.run(View.java:22429)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Caused by: java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.widget.TextView
at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:388)
at android.widget.ArrayAdapter.getDropDownView(ArrayAdapter.java:457)
at com.example.ellen.spinnercontent.MainActivity$1.getDropDownView(MainActivity.java:75)
at android.widget.Spinner$DropDownAdapter.getDropDownView(Spinner.java:975)
at android.widget.Spinner$DropDownAdapter.getView(Spinner.java:971)
at android.widget.Spinner.measureContentWidth(Spinner.java:845)
at android.widget.Spinner$DropdownPopup.computeContentWidth(Spinner.java:1206)
at android.widget.Spinner$DropdownPopup.show(Spinner.java:1232)
at android.widget.Spinner.performClick(Spinner.java:770)
at android.support.v7.widget.AppCompatSpinner.performClick(AppCompatSpinner.java:448)
at android.view.View$PerformClick.run(View.java:22429)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Application terminated.
LogCat:
04-18 18:49:42.329 3536-3536/? I/art: Not late-enabling -Xcheck:jni (already on)
04-18 18:49:42.330 3536-3536/? W/art: Unexpected CPU variant for X86 using defaults: x86
04-18 18:49:42.490 3536-3536/com.example.ellen.spinnercontent W/System: ClassLoader referenced unknown path: /data/app/com.example.ellen.spinnercontent-3/lib/x86
04-18 18:49:42.569 3536-3536/com.example.ellen.spinnercontent W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
04-18 18:49:42.902 3536-3553/com.example.ellen.spinnercontent I/OpenGLRenderer: Initialized EGL, version 1.4
04-18 18:49:42.902 3536-3553/com.example.ellen.spinnercontent D/OpenGLRenderer: Swap behavior 1
04-18 18:49:42.909 3536-3553/com.example.ellen.spinnercontent W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
04-18 18:49:42.909 3536-3553/com.example.ellen.spinnercontent D/OpenGLRenderer: Swap behavior 0
04-18 18:49:42.946 3536-3553/com.example.ellen.spinnercontent D/EGL_emulation: eglCreateContext: 0xaf8850c0: maj 2 min 0 rcv 2
04-18 18:49:42.980 3536-3553/com.example.ellen.spinnercontent D/EGL_emulation: eglMakeCurrent: 0xaf8850c0: ver 2 0 (tinfo 0xaf8834d0)
04-18 18:49:43.046 3536-3553/com.example.ellen.spinnercontent D/EGL_emulation: eglMakeCurrent: 0xaf8850c0: ver 2 0 (tinfo 0xaf8834d0)
04-18 18:50:12.385 3536-3536/com.example.ellen.spinnercontent E/ArrayAdapter: You must supply a resource ID for a TextView
04-18 18:50:12.386 3536-3536/com.example.ellen.spinnercontent D/AndroidRuntime: Shutting down VM
--------- beginning of crash
04-18 18:50:12.392 3536-3536/com.example.ellen.spinnercontent E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.ellen.spinnercontent, PID: 3536
java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView
at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:401)
at android.widget.ArrayAdapter.getDropDownView(ArrayAdapter.java:457)
at com.example.ellen.spinnercontent.MainActivity$1.getDropDownView(MainActivity.java:75)
at android.widget.Spinner$DropDownAdapter.getDropDownView(Spinner.java:975)
at android.widget.Spinner$DropDownAdapter.getView(Spinner.java:971)
at android.widget.Spinner.measureContentWidth(Spinner.java:845)
at android.widget.Spinner$DropdownPopup.computeContentWidth(Spinner.java:1206)
at android.widget.Spinner$DropdownPopup.show(Spinner.java:1232)
at android.widget.Spinner.performClick(Spinner.java:770)
at android.support.v7.widget.AppCompatSpinner.performClick(AppCompatSpinner.java:448)
at android.view.View$PerformClick.run(View.java:22429)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Caused by: java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.widget.TextView
at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:388)
at android.widget.ArrayAdapter.getDropDownView(ArrayAdapter.java:457)
at com.example.ellen.spinnercontent.MainActivity$1.getDropDownView(MainActivity.java:75)
at android.widget.Spinner$DropDownAdapter.getDropDownView(Spinner.java:975)
at android.widget.Spinner$DropDownAdapter.getView(Spinner.java:971)
at android.widget.Spinner.measureContentWidth(Spinner.java:845)
at android.widget.Spinner$DropdownPopup.computeContentWidth(Spinner.java:1206)
at android.widget.Spinner$DropdownPopup.show(Spinner.java:1232)
at android.widget.Spinner.performClick(Spinner.java:770)
at android.support.v7.widget.AppCompatSpinner.performClick(AppCompatSpinner.java:448)
at android.view.View$PerformClick.run(View.java:22429)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
1 ответ
Я также столкнулся с подобной проблемой. Перейдите по этой ссылке, и я надеюсь, что это может помочь вам!
/questions/3302085/kak-sdelat-android-spinner-s-nachalnyim-tekstom-select-one/3302096#3302096
Имейте это в виду тоже:
- Обычно первый выбор в адаптере показывается пользователю.
NothingSelectedSpinnerAdapter
позволит вам отображать "Выбрать..." вместо первого выбора. - Следовательно, нам нужно установить
nominee_relationship_et.setSelection(pos+1);
правильно отображать элементы (игнорируя первый). - Также обратите внимание, что
setOnItemSelectedListener
вызывается 2 раза:1) во время инициализации 2) щелчок элемента. Следовательно, поддерживайте флаг, чтобы предотвратить неправильный выбор элемента прядильщика.