2014-09-04 34 views
0

我学习纱厂在Android和我已经测试出现在Android开发者的这个链接的代码简单的微调: http://developer.android.com/guide/topics/ui/controls/spinner.html错误与Android

但它不工作,这些都是文件:

MainActivity.java

... 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Spinner spinner = (Spinner) findViewById(R.id.planets_spinner); 
    // Create an ArrayAdapter using the string array and a default spinner layout 
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, 
      R.array.planets_array, android.R.layout.simple_spinner_item); 
    // Specify the layout to use when the list of choices appears 
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    // Apply the adapter to the spinner 
    spinner.setAdapter(adapter); 
    if (savedInstanceState == null) { 
     getSupportFragmentManager().beginTransaction() 
       .add(R.id.container, new PlaceholderFragment()) 
       .commit(); 
    } 
} 
... 

fragment_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
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.example.spinners.MainActivity$PlaceholderFragment" > 

<Spinner 
    android:id="@+id/planets_spinner" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" /> 

的strings.xml

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

<string name="app_name">Spinners</string>  
<string name="action_settings">Settings</string> 
<string-array name="planets_array"> 
    <item>Mercury</item> 
    <item>Venus</item> 
    <item>Earth</item> 
    <item>Mars</item> 
    <item>Jupiter</item> 
    <item>Saturn</item> 
    <item>Uranus</item> 
    <item>Neptune</item> 
</string-array> 

当我尝试应用程序显示一些错误:

E/AndroidRuntime(1381): FATAL EXCEPTION: main 
Process: com.example.spinners, PID: 1381 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.spinners/com.example.spinners.MainActivity}: java.lang.NullPointerException 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) 
    at android.app.ActivityThread.access$800(ActivityThread.java:135) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5017) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
    at com.example.spinners.MainActivity.onCreate(MainActivity.java:28) 
    at android.app.Activity.performCreate(Activity.java:5231) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159) 
    ... 11 more 

第28行是:

spinner.setAdapter(adapter); 

你能解释一下为什么它现在在工作吗?谢谢!

+0

你有没有得到它的工作? – geekCode 2014-09-05 00:25:03

回答

0

谢谢您的回答@maraci,这是解决方案:

用于填充微调的代码必须放在片段的类中,在onCreateView方法,所以MainActivity.java看起来是这样的:

public class MainActivity extends ActionBarActivity { 

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

     if (savedInstanceState == null) { 
      getSupportFragmentManager().beginTransaction() 
        .add(R.id.container, new PlaceholderFragment()) 
        .commit(); 
     }     
    }   

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 
     if (id == R.id.action_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    /** 
    * A placeholder fragment containing a simple view. 
    */ 
    public static class PlaceholderFragment extends Fragment { 

     public PlaceholderFragment() { 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 
      View rootView = inflater.inflate(R.layout.fragment_main, container, false); 

      Spinner spinner = (Spinner) rootView.findViewById(R.id.planets_spinner);    
      ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(),R.array.planets_array, android.R.layout.simple_spinner_item);    
      adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);   
      spinner.setAdapter(adapter); 

      return rootView; 
     }     
    } 
} 
0

您当前所加载的布局activity_main.xml中:

setContentView(R.layout.activity_main); 

但你的微调器称为fragment_main.xml

改变布局定义

setContentView(R.layout.activity_main); 

setContentView(R.layout.fragment_main); 

编辑: 根据评论,似乎这个问题是,你没有加载你的片段,然后尝试从你的活动访问其xml布局中的元素。

+0

感谢你的理解,但是MainActivity.java中还有其他一些方法来管理布局“activity_main”和“fragment_main”,如果我将注释放在Spinner中的代码工作,但是使用空的Spinner,那么错误正在填充微调。 – 2014-09-04 22:29:40

+0

对不起,我想我只是不确定你目前的Activity/Fragment设置是什么。 我相信根据你问题中的信息,问题是findViewById(R.id.planets_spinner)返回null。对我来说,这似乎是因为包含在xml中的旋转器的视图永远不会被加载,并且您的活动不知道任何事情。 你是什么意思“如果我把评论代码填充微调工程”?评论代码? – maraci 2014-09-05 15:31:28

+0

此外,您可能会在稍后的活动生命周期中加载您的片段代码。如果是这样的话,那么当你试图找到微调器时,你会得到一个空返回值,因为这个片段还没有被加载。确保先加载片段,然后在你的微调器上使用findViewById。 – maraci 2014-09-05 15:36:33