Java findViewById()未找到自定义视图,但它存在于布局中
不知何故,我的acitivity_main.xml具有视图BottomSelectElement(自定义视图),但我在活动中找不到它,但我可以找到任何其他内容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
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);
}
}