【问题标题】:Nullpointer Exception in FragmentActivity while showing data in Spinner from databaseFragmentActivity 中的 Nullpointer 异常,同时在 Spinner 中显示来自数据库的数据
【发布时间】:2014-02-02 13:05:48
【问题描述】:

我在 FrameActivity 中使用 FragmentPagerAdapter 声明我的可滑动标签时遇到问题。在其中一个选项卡中包含 Spinner,我想在其中从数据库中收集数据。首先我要发布我的 FrameActivity

     public class TranscationMain extends FragmentActivity implements
  ActionBar.TabListener {
Context context;
private ViewPager viewPager;
Spinner spinner_question ;
ContentValues values;                
SQLiteDatabase sql_lite_db_obj; 
private TabsPagerAdapter mAdapter;
private ActionBar actionBar;
Cursor cursor;
int i =0;
// Tab titles
private String[] tabs = { "Shipped In", "shipped Out", "New Entry" };

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

    AndroidContext.setContext(this);        
    sql_lite_db_obj = DatabaseHelper.getInstance().getDb(); 
    values = new ContentValues();

    // Initilization
    context = this;
    viewPager = (ViewPager) findViewById(R.id.pager);
    actionBar = getActionBar();
    mAdapter = new TabsPagerAdapter(getSupportFragmentManager());  

    viewPager.setAdapter(mAdapter);
    actionBar.setHomeButtonEnabled(false);
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);      


    spinner_question = (Spinner)findViewById(R.id.spinner_category);


    // Adding Tabs
    for (String tab_name : tabs) {
        actionBar.addTab(actionBar.newTab().setText(tab_name).setTabListener(this));
    }
    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {

            actionBar.setSelectedNavigationItem(position);
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    });


}  

@Override
public void onTabReselected(Tab arg0, FragmentTransaction arg1) {
    // TODO Auto-generated method stub

}

@Override
public void onTabSelected(Tab arg0, FragmentTransaction arg1) {
    // TODO Auto-generated method stub
    viewPager.setCurrentItem(arg0.getPosition());

}

@Override
public void onTabUnselected(Tab arg0, FragmentTransaction arg1) {
    // TODO Auto-generated method stub

}
        public void clickHandler(View v)   
{

    if (v.getId() == R.id.btn_new_category_id) {
        // btn click event that define in NewEntry.java calss
                    // click on this button alert dialog will open with editext
                    // from where i insert data in database. which i have to show in 
                     // spinner which define in same activity. Insertion of data is
                   // done successfully. 
    }

}
     private void insertData(String category) {  
    // method to insert data in database
           // working fine
}

现在这是上面代码的异常部分

   private void loadSpinnerData() {  
    DatabaseHelper db = new DatabaseHelper(getApplicationContext());  
    List<String> lables = db.getAllLabels();  
    System.out.println(" data in array : "+lables);

    // Creating adapter for spinner  
    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, lables);
    System.out.println(" dapater : "+dataAdapter);

    // Drop down layout style - list view with radio button  
    dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);  

    // attaching data adapter to spinner  
    spinner_question.setAdapter(dataAdapter);  
}

我想在这个块中调用这个方法

       if (v.getId() == R.id.btn_new_category_id) {
             loadSpinnerData()
              }

但我总是得到一个 NullPointer Exception 。只是因为

的初始化
        spinner_question = (Spinner)findViewById(R.id.spinner_category);

Spinner 没有定义在上面 TranscationMain 的布局中,它定义在下面的 Fragment 中

        public class NewEntry extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
       spnr = new Spinner(getActivity());
    View rootView = inflater.inflate(R.layout.new_entry, container, false);

    return rootView;
}

}

这就是为什么我在下面的行中遇到异常。

   spinner_question.setAdapter(dataAdapter);  

现在我不明白我该如何解决这个问题。如何在 Fragment 的微调器中绑定数据。我是片段活动的新手。在此先感谢大家

【问题讨论】:

    标签: android nullpointerexception spinner fragment


    【解决方案1】:
    Spinner is not define in above TranscationMain's layout, It define in below Fragment
    

    这就是崩溃的原因。

    findViewById 在当前的膨胀布局中查找视图。

    如果微调器在片段中,您需要在片段中初始化相同,然后将项目从数据库加载到片段中的微调器。

    在片段中

    Spinner spinner_question;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    
    View rootView = inflater.inflate(R.layout.new_entry, container, false);
    spinner_question = (Spinner)rootView.findViewById(R.id.spinner_category);
    return rootView;
    }
    

    【讨论】:

    • @Raghunandan.. 当我试图在 Fragment 中定义微调器时,findViewById 不起作用。那么我将如何将 xml 中的微调器与 java 文件绑定。?
    • @Raghunandan...Spinner spnr; spnr = new Spinner(getActivity()); loadSpinnerData();私有 void loadSpinnerData() { DatabaseHelper db = new DatabaseHelper(getActivity());列表 标签 = db.getAllLabels(); ArrayAdapter dataAdapter = new ArrayAdapter(this,android.R.layout.simple_spinner_item, labels); dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spnr.setAdapter(dataAdapter); }
    • @Raghunanadan.. 但我在 ArrayAdapetr 中遇到错误“构造函数 ArrayAdapter(NewEntry, int, List) 未定义”
    • @BlueGreen 您需要阅读文档。 ArrayAdapter&lt;String&gt; dataAdapter = new ArrayAdapter&lt;String&gt;(getActivity(),android.R.layout.simple_spinner_item, lables);this 指的是片段而不是活动上下文
    • @BlueGreen 现在发生了什么??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    相关资源
    最近更新 更多