My program is on designing a spinner with hint word "Introduction" before clicking the arrow of the spinner to select items, as I click the arrow, it will appear a drop-down menu with several items, but I don't want the hint word to appear as one of the items in the drop-down menu. And as I click one of the items inside the spinner, it leads me to the corresponding fragment.
My program is able to run smoothly before I add the hint word. However, after I revise my codes with the hint function, I cannot run it expectedly anymore.......
My program so far is able to showcase the first layout as I run, but it dies every time I click the arrow of the spinner, showing "app has stopped". (there is no message error in my program, but there are some clues in logcat and run, i try to read them but still fail to understand)
my hint revision is based on these sites:
How to make an Android Spinner with initial text "Select One"
https://android--code.blogspot.tw/2015/08/android-spinner-hint.html
and some other sites, but most of them are pretty complex for newbie like me to revise to fit with my needs. Thank you very very much for helping me out><
MainActivity.java: package 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>
run:
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)