Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java findViewById()未找到自定义视图,但它存在于布局中_Java_Android - Fatal编程技术网

Java findViewById()未找到自定义视图,但它存在于布局中

Java findViewById()未找到自定义视图,但它存在于布局中,java,android,Java,Android,不知何故,我的acitivity_main.xml具有视图BottomSelectElement(自定义视图),但我在活动中找不到它,但我可以找到任何其他内容 public class MainActivity extends AppCompatActivity { private final String TAG = this.getClass().getSimpleName(); @Override protected void onCreate(Bundle s

不知何故,我的acitivity_main.xml具有视图BottomSelectElement(自定义视图),但我在活动中找不到它,但我可以找到任何其他内容

public class MainActivity extends AppCompatActivity {

    private final String TAG = this.getClass().getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
    }

    @Override
    protected void onStart() {
        super.onStart();
        BottomSelectElement bottomSelectElement = findViewById(R.id.customBottomSelect);
        Log.d(TAG, "onStart: bottomSelectElement " + bottomSelectElement); // this returns null, althought it should exist!
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return super.onCreateOptionsMenu(menu);
    }
}
activity_main.xml(删除不必要的部分)


我重新启动了几次Android Studio,重建并清理了它。它似乎找不到这个id。

因为在构造函数中,您使用了
super(context)
而不是
super(context,attrs)

有意义的是,如果不传入属性(如id),则视图将没有id,因此无法使用该id查找视图。:-)


答案参考:

确切的错误是什么?@Konrad您能提供两个类中的导入吗?您只实现了两个构造函数,缺少第三个带参数的构造函数(上下文上下文、属性集属性、int-defStyle)。也许这就是从xml正确膨胀自定义视图所需的工具?@0X0nosugar您完全正确!问题是,我没有在具有这些参数的构造函数上使用super(context,attributeSet)。谢谢嗯,在这种情况下,不是我有正确的想法,而是@tamtom。(+1!)我刚刚找到了解决方案,但谢谢!这和你描述的一模一样。
public class BottomSelectElement extends ConstraintLayout {

    private Spinner spinner;

    public BottomSelectElement(Context context) {
        super(context);

            init();
        }

        public BottomSelectElement(Context context, AttributeSet attributeSet) {
            super(context);
            init();
        }

        private void init() {
            inflate(getContext(), R.layout.bottom_select_element, this);
            spinner = findViewById(R.id.spinner);
            List<String> categories = Arrays.asList("foo", "bar", "baz");
            ArrayAdapter adapter = new ArrayAdapter<>(getContext(), R.layout.spinner_text, categories);
            adapter.setDropDownViewResource(R.layout.spinner_text_checked);
            spinner.setAdapter(adapter);
        }

        public Spinner getSpinner() {
            return spinner;
        }
    }
public class MainActivity extends AppCompatActivity {

    private final String TAG = this.getClass().getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
    }

    @Override
    protected void onStart() {
        super.onStart();
        BottomSelectElement bottomSelectElement = findViewById(R.id.customBottomSelect);
        Log.d(TAG, "onStart: bottomSelectElement " + bottomSelectElement); // this returns null, althought it should exist!
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return super.onCreateOptionsMenu(menu);
    }
}