java - 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' 在空对象引用 &-
我试图在我的Home
活动中定义一个按钮来打开我的Settings
活动,但我得到了错误:
问题描述
我试图在我的Home
活动中定义一个按钮来打开我的Settings
活动,但我得到了错误:
java.lang.RuntimeException:无法启动活动 ComponentInfo{com.example.padmw/com.example.padmw.Home}:java.lang.NullPointerException:尝试调用虚拟方法 'void android.widget.Button.setOnClickListener(android. view.View$OnClickListener)' 在空对象引用上
我的“设置”项的布局在 中res/menu
,我尝试将其移动到res/layout
但它说元素项不应该在那里。我应该怎么办?
我在 Home.class 中的按钮:
Button mButton = (Button) findViewById(R.id.action_settings);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(Home.this, SettingsActivity.class));
}
});
我在 res/home.xml 中的项目:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:title="@string/action_settings"
app:showAsAction="never" />
</menu>
如何在间接使用列标题样式时动态切换列标题样式,在每列中使用 BasedOn 继承
我有一个数据网格。我希望对其进行样式设置,允许用户从一组主题(最初是浅色和深色)中选择一个主题。据我所知,我只能为单个主题执行此操作。
我考虑过使用 DataGridColumnHeader 样式Resources
通过 DynamicResource 使用它并在代码隐藏中更改它,但在任何窗口显示之前我收到此错误,然后是 2 个类似的错误:
System.Windows.Markup.XamlParseException
HResult=0x80131501
Message=A 'DynamicResourceExtension' cannot be set on the 'BasedOn' property of type 'Style'. A 'DynamicResourceExtension' can only be set on a DependencyProperty of a DependencyObject.
Source=PresentationFramework
StackTrace:
at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
at System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri)
at System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream)
at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator)
at wpf_datagrid_themes_1.MainWindow.InitializeComponent() in G:\Lucru\teste\wpf-datagrid-themes-1\wpf-datagrid-themes-1\MainWindow.xaml:line 1
我也尝试在 DataGrid.ColumnHeaderStyle 中移动这种样式,但后来我无法继承它。
XAML
<Window x:Class="wpf_datagrid_themes_1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:wpf_datagrid_themes_1"
mc:Ignorable="d"
Title="MainWindow" Height="200" Width="450">
<Grid Margin="20">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<DataGrid x:Name="MyDataGrid">
<DataGrid.Resources>
<Style TargetType="DataGridColumnHeader" x:Key="DataGridColumnHeaderDarkStyle">
<Setter Property="Background" Value="Black"/>
<Setter Property="TextElement.Foreground" Value="White"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="BorderBrush" Value="Gray"/>
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="Column 1" Width="*">
<DataGridTextColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader" BasedOn="{DynamicResource DataGridColumnHeaderDarkStyle}">
<Setter Property="ToolTip" Value="ToolTip for column 1"/>
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="Column 2" Width="*">
<DataGridTextColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader" BasedOn="{DynamicResource DataGridColumnHeaderDarkStyle}">
<Setter Property="ToolTip" Value="ToolTip for column 2"/>
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="Column 3" Width="*">
<DataGridTextColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader" BasedOn="{DynamicResource DataGridColumnHeaderDarkStyle}">
<Setter Property="ToolTip" Value="ToolTip for column 3"/>
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
<Button Grid.Row="1" Click="Button_Click" Margin="10">
CHANGE
</Button>
</Grid>
</Window>
代码隐藏
using System.Windows;
using System.Windows.Controls.Primitives;
namespace wpf_datagrid_themes_1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
// Ideally, this handler should:
//
// if ( the dark style is applied ) : apply the light style
// else : apply the dark style
MyDataGrid.Resources["DataGridColumnHeaderDarkStyle"] =
new Style(typeof(DataGridColumnHeader));
}
}
}
使用 StaticResource 而不是 DynamicResource 时的屏幕截图
上面提供的代码和标记不能很好地工作,因为将 BasedOn 与 DynamicResource 一起使用会引发错误。我希望它会起作用,但我必须找到一个解决方法。
我将 .NET Framework 4.7.2 与 VS 2019(撰写本文时的最新稳定版本)和 Windows 10(撰写本文时的最新稳定版本)一起使用。
谢谢你。
解决方案
所以对于菜单项,我们这样做 1) 要为一个活动指定选项菜单,重写 onCreateOptionsMenu()。在这种方法中,您可以扩充您的菜单资源:-
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.game_menu, menu);
return true;
}
2) 处理点击事件:您可以将此 ID 与已知菜单项进行匹配以执行适当的操作。例如:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.action_settings:
// do your work
return true;
default:
return super.onOptionsItemSelected(item);
}
}
推荐阅读
- c# - 在 C# 中为特定进程实例获取私有工作集内存的最佳方法
- sharepoint - 将 Sharepoint 环境从一个场复制到另一个场
- asp.net-mvc - 如何在 asp.net core 2.2 pages 站点上路由到 wwwroot/index.html
- javascript - 有没有办法在不一次查询所有标签的情况下找到下一个相似的标签?
- graphql - 使用 GraphQL Apollo 同时进行轮询和分页?
- sql - 如何根据多条记录中存在的交易计算运行剩余余额/金额
- android - 滚动到 Android 的 Recycler 视图中的下一组视图
- django - 食谱餐上的 Django 多对多关系
- qt - 为什么在我的自定义 Slider 类中调用 setValue 会导致该程序崩溃?
- swift - 未从 YPImagePicker 显示所选图像
我试图在我的Home
活动中定义一个按钮来打开我的Settings
活动,但我得到了错误:
问题描述
我试图在我的Home
活动中定义一个按钮来打开我的Settings
活动,但我得到了错误:
java.lang.RuntimeException:无法启动活动 ComponentInfo{com.example.padmw/com.example.padmw.Home}:java.lang.NullPointerException:尝试调用虚拟方法 'void android.widget.Button.setOnClickListener(android. view.View$OnClickListener)' 在空对象引用上
我的“设置”项的布局在 中res/menu
,我尝试将其移动到res/layout
但它说元素项不应该在那里。我应该怎么办?
我在 Home.class 中的按钮:
Button mButton = (Button) findViewById(R.id.action_settings);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(Home.this, SettingsActivity.class));
}
});
我在 res/home.xml 中的项目:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:title="@string/action_settings"
app:showAsAction="never" />
</menu>
如何在间接使用列标题样式时动态切换列标题样式,在每列中使用 BasedOn 继承
我有一个数据网格。我希望对其进行样式设置,允许用户从一组主题(最初是浅色和深色)中选择一个主题。据我所知,我只能为单个主题执行此操作。
我考虑过使用 DataGridColumnHeader 样式Resources
通过 DynamicResource 使用它并在代码隐藏中更改它,但在任何窗口显示之前我收到此错误,然后是 2 个类似的错误:
System.Windows.Markup.XamlParseException
HResult=0x80131501
Message=A 'DynamicResourceExtension' cannot be set on the 'BasedOn' property of type 'Style'. A 'DynamicResourceExtension' can only be set on a DependencyProperty of a DependencyObject.
Source=PresentationFramework
StackTrace:
at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
at System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri)
at System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream)
at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator)
at wpf_datagrid_themes_1.MainWindow.InitializeComponent() in G:\Lucru\teste\wpf-datagrid-themes-1\wpf-datagrid-themes-1\MainWindow.xaml:line 1
我也尝试在 DataGrid.ColumnHeaderStyle 中移动这种样式,但后来我无法继承它。
XAML
<Window x:Class="wpf_datagrid_themes_1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:wpf_datagrid_themes_1"
mc:Ignorable="d"
Title="MainWindow" Height="200" Width="450">
<Grid Margin="20">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<DataGrid x:Name="MyDataGrid">
<DataGrid.Resources>
<Style TargetType="DataGridColumnHeader" x:Key="DataGridColumnHeaderDarkStyle">
<Setter Property="Background" Value="Black"/>
<Setter Property="TextElement.Foreground" Value="White"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="BorderBrush" Value="Gray"/>
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="Column 1" Width="*">
<DataGridTextColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader" BasedOn="{DynamicResource DataGridColumnHeaderDarkStyle}">
<Setter Property="ToolTip" Value="ToolTip for column 1"/>
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="Column 2" Width="*">
<DataGridTextColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader" BasedOn="{DynamicResource DataGridColumnHeaderDarkStyle}">
<Setter Property="ToolTip" Value="ToolTip for column 2"/>
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="Column 3" Width="*">
<DataGridTextColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader" BasedOn="{DynamicResource DataGridColumnHeaderDarkStyle}">
<Setter Property="ToolTip" Value="ToolTip for column 3"/>
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
<Button Grid.Row="1" Click="Button_Click" Margin="10">
CHANGE
</Button>
</Grid>
</Window>
代码隐藏
using System.Windows;
using System.Windows.Controls.Primitives;
namespace wpf_datagrid_themes_1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
// Ideally, this handler should:
//
// if ( the dark style is applied ) : apply the light style
// else : apply the dark style
MyDataGrid.Resources["DataGridColumnHeaderDarkStyle"] =
new Style(typeof(DataGridColumnHeader));
}
}
}
使用 StaticResource 而不是 DynamicResource 时的屏幕截图
上面提供的代码和标记不能很好地工作,因为将 BasedOn 与 DynamicResource 一起使用会引发错误。我希望它会起作用,但我必须找到一个解决方法。
我将 .NET Framework 4.7.2 与 VS 2019(撰写本文时的最新稳定版本)和 Windows 10(撰写本文时的最新稳定版本)一起使用。
谢谢你。
解决方案
所以对于菜单项,我们这样做 1) 要为一个活动指定选项菜单,重写 onCreateOptionsMenu()。在这种方法中,您可以扩充您的菜单资源:-
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.game_menu, menu);
return true;
}
2) 处理点击事件:您可以将此 ID 与已知菜单项进行匹配以执行适当的操作。例如:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.action_settings:
// do your work
return true;
default:
return super.onOptionsItemSelected(item);
}
}
推荐阅读
- c# - 在 C# 中为特定进程实例获取私有工作集内存的最佳方法
- sharepoint - 将 Sharepoint 环境从一个场复制到另一个场
- asp.net-mvc - 如何在 asp.net core 2.2 pages 站点上路由到 wwwroot/index.html
- javascript - 有没有办法在不一次查询所有标签的情况下找到下一个相似的标签?
- graphql - 使用 GraphQL Apollo 同时进行轮询和分页?
- sql - 如何根据多条记录中存在的交易计算运行剩余余额/金额
- android - 滚动到 Android 的 Recycler 视图中的下一组视图
- django - 食谱餐上的 Django 多对多关系
- qt - 为什么在我的自定义 Slider 类中调用 setValue 会导致该程序崩溃?
- swift - 未从 YPImagePicker 显示所选图像