2017-01-18 29 views
1

ユーザー生成の文字列(私の場合はクラス - 学校の種類)を取り、一般的なスピナーの方法で表示するスピナーを作成しました。私の問題は、スピナーからアイテムを選択しようとしたときに発生します。私はスピナーをタップしてクラスを選択することができますが、スピナーはクラスを選択したことを決して示しません。ユーザが生成した文字列を追加する前に、完全に機能する文字列配列xmlファイルがありました。スピナーが選択されていないか、デフォルトの選択肢が表示されていません

onCreate()メソッドの最後にnotifyDataSetChanged()を追加しようとしました。透明な背景と黒いテキストのスピナーレイアウトを作成し、setOnItemSelectedListener()に設定しました。いずれも機能しなかったので、コードを元の状態に戻しました。

Screenshot of problem:

addAssignment.java

package com.nbdeg.unityplanner; 

import android.content.Intent; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.widget.ArrayAdapter; 
import android.widget.EditText; 
import android.widget.SeekBar; 
import android.widget.Spinner; 

import com.google.firebase.analytics.FirebaseAnalytics; 
import com.google.firebase.auth.FirebaseAuth; 
import com.google.firebase.auth.FirebaseUser; 
import com.google.firebase.database.DataSnapshot; 
import com.google.firebase.database.DatabaseError; 
import com.google.firebase.database.DatabaseReference; 
import com.google.firebase.database.FirebaseDatabase; 
import com.google.firebase.database.ValueEventListener; 
import com.nbdeg.unityplanner.data.Assignments; 
import com.nbdeg.unityplanner.data.Classes; 

import java.util.ArrayList; 

public class addAssignment extends AppCompatActivity { 

    EditText mAssignmentName; 
    EditText mDueDate; 
    EditText mExtraInfo; 
    Spinner mDueClass; 
    SeekBar mPercentComplete; 
    int percentComplete = 0; 

    FirebaseAnalytics mFirebaseAnalytics; 
    DatabaseReference assignmentDb; 
    DatabaseReference classDb; 
    FirebaseUser user; 

    long assignmentCounter; 
    ArrayList<String> classList = new ArrayList<>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_add_assignment); 

     // Sets title to "Create an assignment" 
     try {getSupportActionBar().setTitle("Create An Assignment");} 
     catch (NullPointerException e) { 
      e.printStackTrace(); 
     } 

     // Getting number of assignments (serves as assignment ID in database) 
     Bundle extras = getIntent().getExtras(); 
     assignmentCounter = extras.getLong("counter"); 

     // Finds firebase database 
     user = FirebaseAuth.getInstance().getCurrentUser(); 
     mFirebaseAnalytics = FirebaseAnalytics.getInstance(this); 
     assignmentDb = FirebaseDatabase.getInstance().getReference().child("users").child(user.getUid()).child("assignments"); 
     classDb = FirebaseDatabase.getInstance().getReference().child("users").child(user.getUid()).child("classes"); 

     // Gets all classes 
     classDb.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       for (DataSnapshot userSnapshot: dataSnapshot.getChildren()) { 
        Classes mClass = userSnapshot.getValue(Classes.class); 
        Log.i("Info", "Class loaded: " + mClass.getClassName()); 
        classList.add(mClass.getClassName()); 
       } 
       Log.i("Info", "Classes loaded: " + classList); 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
      Log.e("DB", "Error: " + databaseError.getMessage()); 
      } 
     }); 

     // Find view by ID calls 
     mAssignmentName = (EditText) findViewById(R.id.assignment_name); 
     mDueDate = (EditText) findViewById(R.id.due_date_edittext); 
     mExtraInfo = (EditText) findViewById(R.id.extra_homework_info); 
     mDueClass = (Spinner) findViewById(R.id.class_spinner); 
     mPercentComplete = (SeekBar) findViewById(R.id.percentComplete); 

     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.spinner_layout, classList); 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

     mDueClass.setAdapter(adapter); 

     // Sets DueDate EditText to open a datepicker when clicked 
     new EditTextDatePicker(this, R.id.due_date_edittext); 

     mPercentComplete.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
      @Override 
      public void onProgressChanged(SeekBar seekBar, int progress, boolean b) { 
       percentComplete = progress; 
      } 

      @Override 
      public void onStartTrackingTouch(SeekBar seekBar) { 
      } 

      @Override 
      public void onStopTrackingTouch(SeekBar seekBar) { 
      } 
     }); 
    } 

    // Adds a SAVE button to the Action Bar 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.save, menu); 
     return true; 
    } 

    // Gets and saves information when SAVE is clicked 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Getting information from views 
     String dueDate = mDueDate.getText().toString(); 
     String assignmentName = mAssignmentName.getText().toString(); 
     String extraInfo = mExtraInfo.getText().toString(); 
     String dueClass = mDueClass.getItemAtPosition(mDueClass.getSelectedItemPosition()).toString(); 

     mFirebaseAnalytics.logEvent("Assignment Created", null); 
     Log.i("DB", "Creating assignment named " + assignmentName); 
     assignmentDb.child(Long.toString(assignmentCounter)).setValue 
       (new Assignments(assignmentName, dueClass, dueDate, extraInfo, percentComplete)); 

     /* 
     // Test to make sure info is being collected correctly. 
     Log.i("Class", dueClass); 
     Log.i("Due", dueDate); 
     Log.i("Name", homeworkName); 
     Log.i("Extra", extraInfo); 
     */ 

     // Bring user back to MainActivity 
     startActivity(new Intent(addAssignment.this, MainActivity.class)); 

     return super.onOptionsItemSelected(item); 
    } 
} 

activity_add_assignment.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_add_homework" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.nbdeg.unityplanner.addAssignment"> 

    <EditText 
     android:layout_width="match_parent" 
     android:layout_height="40dp" 
     android:inputType="textCapSentences" 
     android:ems="10" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentStart="true" 
     android:id="@+id/assignment_name" 
     android:hint="Assignment Name" 
     android:padding="5dp" 
     android:textSize="18sp" 
     android:background="@null" /> 

    <View 
     android:layout_width="match_parent" 
     android:layout_height="1dp" 
     android:background="#c0c0c0" 
     android:layout_below="@id/assignment_name"/> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="43dp" 
     android:orientation="horizontal" 
     android:layout_below="@id/assignment_name" 
     android:layout_alignParentStart="true" 
     android:id="@+id/linearLayout"> 

     <Spinner 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:id="@+id/class_spinner" 
      android:theme="@android:style/Theme.Holo.Light.DarkActionBar" 
      android:layout_weight="1" 
      android:background="@null"/> 

     <View 
      android:layout_width="1dp" 
      android:layout_height="match_parent" 
      android:background="#c0c0c0"/> 

     <EditText 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:id="@+id/due_date_edittext" 
      android:padding="5dp" 
      android:focusable="false" 
      android:hint="Due Date" 
      android:textSize="16sp" 
      android:background="@null" /> 
    </LinearLayout> 

    <View 
     android:layout_width="match_parent" 
     android:layout_height="1dp" 
     android:background="#c0c0c0" 
     android:layout_below="@id/linearLayout"/> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:layout_below="@+id/linearLayout" 
     android:layout_alignParentStart="true" 
     android:id="@+id/percentCompleteLayout" 
     android:layout_marginTop="2dp" 
     android:layout_marginBottom="2dp"> 
     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:text="Completion" 
      android:padding="5dp" 
      android:textColor="@color/black" 
      android:textSize="15sp"/> 
     <SeekBar 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:id="@+id/percentComplete" 
      android:layout_marginBottom="1dp"/> 
    </LinearLayout> 

    <View 
     android:layout_width="match_parent" 
     android:layout_height="1dp" 
     android:background="#c0c0c0" 
     android:layout_below="@id/percentCompleteLayout"/> 

    <EditText 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:inputType="textMultiLine" 
     android:ems="10" 
     android:id="@+id/extra_homework_info" 
     android:hint="Extra Infomation" 
     android:textSize="16sp" 
     android:layout_below="@id/percentCompleteLayout" 
     android:layout_alignParentStart="true" 
     android:layout_marginTop="2dp" 
     android:padding="5dp" 
     android:background="@null" /> 

</RelativeLayout> 

spinner_layout.xml *

<?xml version="1.0" encoding="utf-8"?> 

<TextView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:textSize="16sp" 
    android:gravity="left" 
    android:padding="5dip" 
    android:textColor="@android:color/black" 
    android:background="@android:color/transparent" 
    /> 

これを修正し、スピナーにデフォルト/ユーザーの選択肢を表示させる方法があるのだろうかと思います。それ以上のコードが必要な場合は、そのすべてがGitHubにあります。事前にすべての回答に感謝します!

+0

spinner_layout.xmlのTextViewの中にandroid:id = "@ android:id/text1"を追加してみてください。それが助けて欲しい! –

答えて

0

解決策:アクティビティを開始する前に、たとえばMainActivityでクラスを読み込みます。次に、値をインテントに沿って渡します。

: MainActivty.java

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      // Launch Add Homework Activity 
      Intent intent = new Intent(MainActivity.this, addAssignment.class); 
      intent.putExtra("classListNames", classListNames); 
      startActivity(intent); 
... 
     classDb.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       classList.clear(); 
       for (DataSnapshot userSnapshot: dataSnapshot.getChildren()) { 
        Classes mClass = userSnapshot.getValue(Classes.class); 
        Log.i(TAG, "Class loaded: " + mClass.getClassName()); 
        classList.add(mClass); 
        classListNames.add(mClass.getClassName()); 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       Log.e(TAG, "Error: " + databaseError.getMessage()); 
      } 
     }); 

addAssignment.java

// Gets class list 
    Bundle extras = getIntent().getExtras(); 
    classListNames = extras.getStringArrayList("classListNames"); 
... 
     mDueClass = (Spinner) findViewById(R.id.class_spinner); 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.spinner_layout, classListNames); 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

     mDueClass.setAdapter(adapter); 

原因:いくつかのデバッグした後、私はタイミング差をされるように、問題の原因を発見しました。アプリケーションはクラスが送信されるように要求し、スピナーを作成し、を作成し、次にクラスをロードします。タイミングの差はミリ秒であったが、問題の原因となった。

関連する問題