【问题标题】:Should provide default constructor?应该提供默认构造函数吗?
【发布时间】:2015-02-15 12:52:41
【问题描述】:

我有一个应用程序已转移到新的 android 工作室。当我尝试生成签名的 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();





    }
}

【问题讨论】:

  • public BarcodeFrag(){}
  • 您是否尝试添加默认构造函数?
  • 在代码的哪里,我在 public BarcodeFrag (String scanContent){...} 之后添加了它,它没有工作
  • 你还遇到同样的错误吗?
  • 将我尝试做的事情添加到我的原始帖子中,但没有帮助

标签: android android-studio apk


【解决方案1】:

由于生命周期的原因,Fragment 必须有一个空的构造函数。 考虑用一个空的替换你得到的那个,然后通过Bundle 传递String scanContent。通过这种方式,您可以确保片段始终获得您的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() {
}

然后像这样从onCreateView(...) 获取id

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    if(id == null && getArguments() != null) {
        String scanContent = getArguments().getString("scanContent");
        this.id = scanContent;
    }
    .
    .
    .
    .
}

【讨论】:

  • 对如何更改我的代码感到困惑,我现在在上面发布了整个课程。
  • 你不能有一个带参数的构造函数。删除此public BarcodeFrag(String scanContent) { id = scanContent; }
  • if 语句在哪里?
  • @Mike 请更具体一些
  • 在我添加 public BarCodeFrag(){} 后这段代码在哪里: if(getArguments() != null) { String scanContent = getArguments().getString("scanContent"); this.id = 扫描内容; }
【解决方案2】:

删除

public BarcodeFrag(String scanContent) {
    id = scanContent;
}

Android 中的Fragment 不应该有一个非空的构造函数。相反,您可以在您的 Fragment 中创建一个 static 启动器工厂方法,如下所示:

public static final String SCAN_CONTENT = "param";
private String scanContent;

public static final BarcodeFrag instanceOf(String scanContent) {
    BarcodeFrag fragment = new BarcodeFrag();
    Bundle args = new Bundle();
    args.putString(SCAN_CONTENT, scanContent);
    fragment.setArguments(args);
    return fragment;
}

现在,要从任何其他类创建 BarcodeFrag 的新实例,

Fragment f = BarcodeFrag.instanceOf(scanContent)

并在BarcodeFrag 中访问值scanContent

scanContent = getArguments().getString(SCAN_CONTENT);

传递的参数可以是任意类型,即intfloatString等。

试试这个。这应该有效;

【讨论】:

  • 无法从静态内容中引用“this”
  • 对不起,我的坏...等一下
  • 并且不能从静态内容中引用零件的实例
  • 过去,当我需要传递参数时,我为Fragments 创建了instanceOf() 方法......我稍后会发布正确答案......让我回想一下解决方案:)
  • 嘿,我现在已经发布了正确的答案......试试看,让我知道它是否适合你!
【解决方案3】:

如果没有定义构造函数,那么编译器会自动创建默认构造函数。

如果定义了任何带参数的构造函数。如果调用默认构造函数,则会出现编译错误。

public class P2 {

    public P2(int a) {

    }

    public static void main(String[] args) {
        P2 p = new P2(10);
        P2 p1 = new P2(); //compile time error      
    }
}

为了消除编译时错误,也添加默认构造函数

public class P2 {

    public P2() { //After adding this constructor, compile time error is removed

    }
    public P2(int a) {

    }

    public static void main(String[] args) {
        P2 p = new P2(10);
        P2 p1 = new P2();       
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    相关资源
    最近更新 更多