我有一个转移到新的android studio的应用程序。当我尝试生成签名的apk时,出现此错误:
Error:(24) Error: This fragment should provide a default constructor (a public constructor with no arguments) (com.example.mike.beerportfolionewicon.BarcodeFrag) [ValidFragment]
班级开始像这样:
public class BarcodeFrag extends Fragment implements ReadJSONResult.OnArticleSelectedListener {
private ListView lv;
View v;
SearchView searchView;
private SearchView mSearchView;
private MenuItem mSearchMenuItem;
String id;
public BarcodeFrag(String scanContent) {
id = scanContent;
}
我选择了一个选项来忽略检查,但它仍然不会创建apk。
尝试将其更改为此,但存在相同的错误:
public class BarcodeFrag extends Fragment implements ReadJSONResult.OnArticleSelectedListener {
private ListView lv;
View v;
SearchView searchView;
private SearchView mSearchView;
private MenuItem mSearchMenuItem;
String id;
public BarcodeFrag(){}
public BarcodeFrag(String scanContent) {
id = scanContent;
}
实际上是一个不同的错误:
Error:(35) Error: Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead [ValidFragment]
现在,整个代码如下所示:
public class BarcodeFrag extends Fragment implements ReadJSONResult.OnArticleSelectedListener {
private ListView lv;
View v;
SearchView searchView;
private SearchView mSearchView;
private MenuItem mSearchMenuItem;
String id;
public BarcodeFrag(){}
public BarcodeFrag(String scanContent) {
id = scanContent;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//set layout here
v = inflater.inflate(R.layout.activity_search, container, false);
setHasOptionsMenu(true);
getActivity().setTitle("Search");
//get user information
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
String userName = prefs.getString("userName", null);
String userID = prefs.getString("userID", null);
//run code with barcode content
String url = "http://api.brewerydb.com/v2/search/upc?code="+ id +"&key=xxx&format=json&withBreweries=y";
//run async task
ReadJSONResult task = new ReadJSONResult(getActivity());
task.setOnArticleSelectedListener(this);
task.execute(url);
return v;
}
@Override
public void onArticleSelected(String b, String brewery){
//code to execute on click
Fragment Fragment_one;
FragmentManager man= getFragmentManager();
FragmentTransaction tran = man.beginTransaction();
Fragment_one = new BeerTabs();
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
SharedPreferences.Editor editor = preferences.edit();
editor.putString("beerID",b);
editor.putString("breweryID",brewery);
editor.commit();
tran.replace(R.id.main, Fragment_one);//tran.
tran.addToBackStack(null);
tran.commit();
}
}
最佳答案
由于生命周期原因,片段必须具有空的构造函数。
考虑用空的1替换得到的,然后通过String scanContent
传递Bundle
。这样,您可以确保即使片段重新创建,该片段也始终会得到您的scanContent
。
Fragment fragment = new Fragment() {
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if(getArguments() != null) {
String scanContent = getArguments().getString("scanContent");
}
}
};
Bundle bundle = new Bundle();
bundle.putString("scanContent", scanContent);
fragment.setArguments(bundle);
编辑:
从您的
Activity
:BarcodeFrag fragment = new BarcodeFrag();
Bundle bundle = new Bundle();
bundle.putString("scanContent", scanContent);
fragment.setArguments(bundle);
在您的
Fragment
上,替换 public BarcodeFrag(String scanContent) {
id = scanContent;
}
与
public BarcodeFrag() {
}
然后像这样从
id
获取onCreateView(...)
:@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if(id == null && getArguments() != null) {
String scanContent = getArguments().getString("scanContent");
this.id = scanContent;
}
.
.
.
.
}