我有一个转移到新的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;
    }
    .
    .
    .
    .
}

07-24 09:48
查看更多