2016-09-03 5 views
0

私が見つけたことは、strings.xmlファイルを使用してスピナーを設定していることです。私がしたいことは、JSONレスポンスから得た情報に基づいてスピナーを作成することです。私はテーブルを作成するのにこれを修正するために使用した次のコードを持っています。しかし、私のスピナーはまだ空白であると私はここでD/ViewRootImpl: #3 mView = nullSpinnerにStrings.xmlファイルを設定しないでください

以外のエラーを取得しないスピナーを移入するコードは次のとおりです。ここで

public class SecondFragment extends Fragment implements APIRequestsUtil.APIRequestResponseListener 
{ 
    View myView; 
    Map<String, Route> drives; 
    private ArrayAdapter<Integer> adapter; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     myView = inflater.inflate(R.layout.second_layout, container, false); 
     APIRequestsUtil.setOnNetWorkListener(this); 
     return myView; 
    } 

    private void populateView() { 
     this.getActivity().runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       drives = APIRequestsUtil.getRoutes(); 

       Spinner spinner = (Spinner) myView.findViewById(R.id.spinner); 
       int driveNum = 0; 
       for (Map.Entry drive : drives.entrySet()) { 
        TableRow tr = new TableRow(getActivity()); 
        Route route = (Route) drive.getValue(); 
        tr.setId(driveNum++); 
        //tr.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 



        spinner.setId(driveNum); 

       } 
      } 
     }); 

    } 

    //@Override 
    public void onFailure(Request request, Throwable throwable) { 

    } 

    //@Override 
    public void onResponse(Response response) { 
     populateView(); 
    } 
} 

は私のXMLです:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" android:layout_height="match_parent"> 

    <Spinner 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentStart="true" 
     android:id="@+id/spinner"/> 
</RelativeLayout> 

答えて

3

だから、すべてのものstrings.xmlファイルを使用してスピンを設定しています。

Here is a sample appこれは、SpinnerにJava配列の内容を移入することを示しています。

documentationSpinnerを移入するための配列のリソースを使用するために起こる、しかし、あなたはそれらのサンプルコードはcreateFromResource()を使用して作成し、いずれかのいくつかの他のArrayAdapterに入れ替えることができます。ここで

スピナー

を移入するコードはSpinnerを移入そこにはコードがありませんです。レイアウトからSpinnerを取得します。その後、ループ内でsetId()を呼び出します。—なぜ私は完全にその理由がわかりません。あなたは約束を保持しているadapterという名前のArrayAdapterを持っていますが、決してそれを設定しません。ここで

は、私は上記にリンクされているサンプルアプリケーションからの活動です:

/*** 
    Copyright (c) 2008-2012 CommonsWare, LLC 
    Licensed under the Apache License, Version 2.0 (the "License"); you may not 
    use this file except in compliance with the License. You may obtain a copy 
    of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required 
    by applicable law or agreed to in writing, software distributed under the 
    License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
    OF ANY KIND, either express or implied. See the License for the specific 
    language governing permissions and limitations under the License. 

    From _The Busy Coder's Guide to Android Development_ 
    https://commonsware.com/Android 
*/ 

package com.commonsware.android.selection; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.Spinner; 
import android.widget.TextView; 

public class SpinnerDemo extends Activity 
    implements AdapterView.OnItemSelectedListener { 
    private TextView selection; 
    private static final String[] items={"lorem", "ipsum", "dolor", 
      "sit", "amet", 
      "consectetuer", "adipiscing", "elit", "morbi", "vel", 
      "ligula", "vitae", "arcu", "aliquet", "mollis", 
      "etiam", "vel", "erat", "placerat", "ante", 
      "porttitor", "sodales", "pellentesque", "augue", "purus"}; 

    @Override 
    public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.main); 
    selection=(TextView)findViewById(R.id.selection); 

    Spinner spin=(Spinner)findViewById(R.id.spinner); 
    spin.setOnItemSelectedListener(this); 

    ArrayAdapter<String> aa=new ArrayAdapter<String>(this, 
           android.R.layout.simple_spinner_item, 
           items); 

    aa.setDropDownViewResource(
     android.R.layout.simple_spinner_dropdown_item); 
    spin.setAdapter(aa); 
    } 

    @Override 
    public void onItemSelected(AdapterView<?> parent, 
           View v, int position, long id) { 
    selection.setText(items[position]); 
    } 

    @Override 
    public void onNothingSelected(AdapterView<?> parent) { 
    selection.setText(""); 
    } 
} 

これは、ドキュメントのと同じレシピに従ってください。私はArrayAdapterインスタンスを作成するためにコンストラクタを使用し、String[]のモデルデータをラップします。 Spinnerに何を持ちたいのかは不明ですが、ArrayAdapter<Integer>(コードに表示されているように)またはArrayAdapter<Route>などを使用できます。

さらに複雑なシナリオの場合は、ListViewの例を探します。 Spinner 2つだけ大きな変化と、ほぼ同じように動作します:

  • あなたは(上記のコードでsetDropDownViewResource()を参照)は、2つのレイアウトリソースを提供する必要があります。また、ArrayAdapterのカスタムサブクラスでgetView()をオーバーライドすると、おそらくgetDropDownView()をオーバーライドする必要があります。

  • Spinner火災選択イベントではなく、アイテムのクリックイベント

+0

私は、リストビューを使用しますが、リストビューを使用すると、あまりにも多くのページ上に行くことになるので、私は、ドロップダウンを必要とします。 –

+0

@JamesRobertSingleton:これは問題ありません。私の指摘は、 'Spinner'は' ListView'のように動作することです。 'ListView'も実質的により一般的です。ですから、 'Spinner'を使って何かをする例が見つからない場合、' ListView'を使って同じことをする例を見つけて、 'Spinner'で実装する方法の手がかりを与えるべきです。 – CommonsWare

+0

この例では、private static final String [] items = {"lorem"、 "ipsum"、 "dolor"など}があります。私はこれらの値を設定したくない。 –

関連する問題