我为公司进行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());
}
});
}
}
答案 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;
}
我希望这会有所帮助。