Android 使用片段:有几个问题

Android 使用片段:有几个问题,android,android-fragments,Android,Android Fragments,我为我的公司做iOS开发,并开发了主要的移动应用程序,用于我们的会议。android应用程序的开发最初是外包的,因为它太贵了,无法包含我编写的应用程序的所有iOS功能,我们使用了一个基本的android外壳,并使用了大量的网络视图,我们的移动web应用程序(HTML5)也使用了这些视图 由于预算限制,应用程序上的所有android开发现在都由我负责。我几乎没有java/android操作系统的经验,但我学得很快。我成功地从web服务中提取数据,将其存储在SQLite中,并使用它在应用程序中填充一

我为我的公司做iOS开发,并开发了主要的移动应用程序,用于我们的会议。android应用程序的开发最初是外包的,因为它太贵了,无法包含我编写的应用程序的所有iOS功能,我们使用了一个基本的android外壳,并使用了大量的网络视图,我们的移动web应用程序(HTML5)也使用了这些视图

由于预算限制,应用程序上的所有android开发现在都由我负责。我几乎没有java/android操作系统的经验,但我学得很快。我成功地从web服务中提取数据,将其存储在SQLite中,并使用它在应用程序中填充一个使用活动的列表,该活动最初不在应用程序中(我正在尝试从WebView中移除)。然而,我意识到应用程序中的大部分功能都是使用片段构建的。当我试图将活动转换为片段时,我遇到了问题。代码如下

我对该方法有疑问:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState)
错误是“
此方法必须返回类型为View的结果。

在displayListView()方法中,我在以下两行中得到错误:

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

EditText myFilter = (EditText) findViewById(R.id.myFilter);
错误是“
类型EhallSchedFragment2的findViewById(int)方法未定义”

片段中的完整代码如下所示:

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());
                 }
             });
    }

}
package org.bicsi.canada2014.fragment;
导入java.util.List;
导入org.bicsi.fall2014.R;
导入org.bicsi.canada2014.adapter.SQLiteDB;
导入android.app.Activity;
导入android.app.Fragment;
导入android.database.Cursor;
导入android.os.Bundle;
导入android.text.Editable;
导入android.text.TextWatcher;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.EditText;
导入android.widget.ListView;
导入android.widget.SimpleCursorAdapter;
导入android.widget.FilterQueryProvider;
公共类EhallSchedFragment2扩展了片段{
public static final String TAG=“defallScheduleFragment”;
私有SQLiteDB sqlite_obj;
列表列表1、列表2、列表3、列表4;
私有SimpleCursorAdapter数据适配器;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
super.onCreateView(充气机、容器、保存状态);
视图v=充气机。充气(R.layout.fragment_ehu明细表,容器,错误);
sqlite_obj=新的SQLiteDB(getActivity());
displayListView();
}
私有void displayListView(){
sqlite_obj.open();
Cursor Cursor=sqlite_obj.fetchAllSchedules();
//要绑定的所需列
字符串[]列=新字符串[]{
SQLiteDB.KEY_SCHEDULEDATE,
SQLiteDB.KEY_SESSIONNAME,
SQLiteDB.KEY\u会话时间
};
//数据将绑定到的XML定义的视图
int[]到=新的int[]{
R.id.textViewScheduleDate,
R.id.textViewSessionName,
R.id.textViewSessionTime,
};
//使用指向所需数据的光标创建适配器
//以及布局信息
dataAdapter=新的SimpleCorsorAdapter(
getActivity(),R.layout.schedule\u info,
光标,
柱,
到
0);
ListView ListView=(ListView)findViewById(R.id.listView1);
//将适配器分配给ListView
setAdapter(dataAdapter);
EditText myFilter=(EditText)findViewById(R.id.myFilter);
myFilter.addTextChangedListener(新的TextWatcher(){
公共无效后文本已更改(可编辑){
}
更改前的公共无效(字符序列、整数开始、,
整数计数,整数后){
}
public void onTextChanged(字符序列,int start,
前整数,整数计数){
dataAdapter.getFilter().filter(s.toString());
}
});
setFilterQueryProvider(新的FilterQueryProvider(){
公共游标运行查询(CharSequence约束){
返回sqlite_obj.fetchScheduleByDate(constraint.toString());
}
});
}
}

首先,您必须在创建视图上返回片段布局的视图。其次,您在onCreateView中膨胀布局,因此您的函数对布局一无所知,您必须通过在onCreateView上膨胀的视图初始化片段内容:

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

在片段的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;

}
 @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;

}
要访问片段布局文件中的组件(如列表视图等),首先必须将其转换为相应的类型,然后在视图上调用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);

    sqlite_obj = new SQLiteDB(getActivity());

    displayListView();

    return v;

}
 @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;

}

我希望这能有所帮助。

我想我正在返回碎片布局的视图:视图v=充气机。充气(R.layout.fragment_ehschedule,container,false);。我的碎片布局是碎片计划。我想,当我为ListView添加上面的行时,因为onCreateView方法在displayListView()方法之外,所以我得到的是“无法解析v”。@bachma0507:不,onCreateView没有返回任何视图。你必须像returnv一样返回;在OnCeCaleVIEW()中,我也会考虑使用一个ListFipe而不是BASE片段类。ListFragment被设计用于顾名思义的列表。