使用片段:有几个问题

时间:2014-08-22 14:04:49

标签: android android-fragments

我为公司进行iOS开发,并构建了我们会议中使用的主要移动应用程序。构建Android应用程序最初是外包的,因为包含我编写的应用程序的所有iOS功能太昂贵了,我们使用了基本的android shell并利用了我们在移动网络应用程序中使用的大量webview(HTML5) )。

由于预算限制,应用程序上的所有Android开发现在都是我的责任。我对java / android操作系统的经验很少,但我学得很快。我成功地包括从Web服务中提取数据,将其存储在SQLite中并使用它来使用活动填充应用程序中的列表,该活动最初在应用程序中不存在(我正在尝试远离Web视图)。但是,我意识到应用程序中的大多数功能都是使用片段构建的。当我尝试将活动转换为片段时,我遇到了问题。代码如下。

我遇到了方法问题:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState)

错误为“This method must return a result of type View.

在我的displayListView()方法中,我在这两行中遇到错误:

ListView listView = (ListView) findViewById(R.id.listView1);

EditText myFilter = (EditText) findViewById(R.id.myFilter);

错误为“The method findViewById(int) is undefined for the type EhallSchedFragment2”。

片段中的完整代码如下:

package org.bicsi.canada2014.fragment;

import java.util.List;
import org.bicsi.fall2014.R;
import org.bicsi.canada2014.adapter.SQLiteDB;
import android.app.Activity;
import android.app.Fragment;
import android.database.Cursor;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.FilterQueryProvider;

public class EhallSchedFragment2 extends Fragment{
    public static final String TAG = "ExHallScheduleFragment";
    private SQLiteDB sqlite_obj;
     List<String> list1, list2, list3, list4;
     private SimpleCursorAdapter dataAdapter;

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

        sqlite_obj = new SQLiteDB(getActivity());

        displayListView();

    }

     private void displayListView(){

        sqlite_obj.open();

         Cursor cursor = sqlite_obj.fetchAllSchedules();

         // The desired columns to be bound
         String[] columns = new String[] {
           SQLiteDB.KEY_SCHEDULEDATE,
           SQLiteDB.KEY_SESSIONNAME,
           SQLiteDB.KEY_SESSIONTIME

         };

         // the XML defined views which the data will be bound to
         int[] to = new int[] { 
           R.id.textViewScheduleDate,
           R.id.textViewSessionName,
           R.id.textViewSessionTime,

         };

         // create the adapter using the cursor pointing to the desired data 
         //as well as the layout information
         dataAdapter = new SimpleCursorAdapter(
                 getActivity(), R.layout.schedule_info, 
                   cursor, 
                   columns, 
                   to,
                   0);

         ListView listView = (ListView) findViewById(R.id.listView1);
         // Assign adapter to ListView
         listView.setAdapter(dataAdapter);

         EditText myFilter = (EditText) findViewById(R.id.myFilter);
          myFilter.addTextChangedListener(new TextWatcher() {

           public void afterTextChanged(Editable s) {
           }

           public void beforeTextChanged(CharSequence s, int start, 
             int count, int after) {
           }

           public void onTextChanged(CharSequence s, int start, 
             int before, int count) {
            dataAdapter.getFilter().filter(s.toString());
           }
          });

          dataAdapter.setFilterQueryProvider(new FilterQueryProvider() {
                 public Cursor runQuery(CharSequence constraint) {
                     return sqlite_obj.fetchScheduleByDate(constraint.toString());
                 }
             });
    }

}

2 个答案:

答案 0 :(得分:1)

首先您必须在 onCreateView 上返回片段布局视图。第二,你在onCreateView中夸大了你的布局,所以你的函数对你的布局一无所知,你必须通过在onCreateView上膨胀的视图来初始化你的Fragment内容:

ListView listView = (ListView)v.findViewById(R.id.listView1);

答案 1 :(得分:1)

在片段的 onCreateView 方法中,该方法的签名表示您必须返回如下视图:

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

    sqlite_obj = new SQLiteDB(getActivity());

    displayListView();

    return v;

}

要访问片段布局文件中的组件(如列表视图等),首先必须将其转换为相应的类型,然后在视图上调用findViewById,如下所示:

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

       Button button = (Button)v.findViewById(R.id.button);

       //always return a view last. A return statement in Java comes last.
       return v;

}

我希望这会有所帮助。