- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试为应用创建一个简单的设置页面。
我想创建一个对象列表,我在 XML 文件中定义了其布局。
在这些对象的布局中有一个标题 TextView、一个帮助 TextView 和一个 Spinner。
当我在代码中动态添加这些对象时,我该如何引用这些单独的 Spinner View 以便获得选定的值?
我目前有一个设置对象(列表将填充的内容):
public class Setting {
private String name;
private String description;
private String[] values;
public Setting(String name, String description, String[] values) {
this.name = name;
this.description = description;
this.values = values;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
public String[] getValues() {
return values;
}
}
将设置对象转换为 View 的自定义 ArrayAdapter:
(R.layout.spinner_row_text_layout.xml 只是一个 TextView ,用于定义微调项的布局)
public class SettingsAdapter extends ArrayAdapter<Setting> {
public SettingsAdapter(Context context, ArrayList<Setting> settings) {
super(context, 0, settings);
}
@Override
// Takes the position in the array, the view to convert, and the parent of the view as parameters
public View getView(int position, View convertView, ViewGroup parent) {
// Get the item in this position
Setting setting = getItem(position);
// Check if a view is being reused, otherwise inflate the view (look at view recycling in lists)
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.settings_row_view, parent, false);
}
// findViewById in the given view to convert
TextView title = (TextView) convertView.findViewById(R.id.titleText);
TextView help = (TextView) convertView.findViewById(R.id.helpText);
Spinner spinner = (Spinner) convertView.findViewById(R.id.spinner);
ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(getContext(), R.layout.spinner_row_text_layout, setting.getValues());
spinner.setAdapter(spinnerAdapter);
title.setText(setting.getName());
help.setText(setting.getDescription());
return convertView;
}
}
以及以下布局文件...
设置页面布局:
<RelativeLayout
android:id="@+id/relativeLayout"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.cgillions.counter.SettingsActivity">
<ListView
android:id="@+id/settingsList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:choiceMode="singleChoice"
android:divider="@color/black"
android:dividerHeight="5dp"/>
</RelativeLayout>
每个 ListView 项目的布局:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:orientation="vertical"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1">
<TextView
android:id="@+id/titleText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Hello"
android:textSize="20sp"
android:textColor="@color/black"
android:gravity="center_vertical"/>
<TextView
android:id="@+id/helpText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/animation_settings_hint"
android:textSize="12sp"
/>
</LinearLayout>
<Spinner
android:id="@+id/spinner"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1.5"/>
</LinearLayout>
当我启动与设置页面布局对应的 Activity 时,出现以下错误:
在 junit.framework.Assert.assertNotNull(Assert.java:211)
在 com.example.cgillions.counter.SettingsActivity.onCreate(SettingsActivity.java:46)
在 android.app.Activity.performCreate(Activity.java:5990)
这是我的 onCreate() 方法:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
setTitle("Settings");
// Create a new Setting object in order to populate list
animSetting = new Setting("Animation", getResources().getString(R.string.animation_settings_hint), getResources().getStringArray(R.array.anim_values));
settings = new ArrayList<>();
settings.add(animSetting);
ListView settingsList = (ListView) findViewById(R.id.settingsList);
assertNotNull(settingsList);
settingsList.setAdapter(new SettingsAdapter(this, settings));
animSpinner = (Spinner) settingsList.findViewById(R.id.spinner);
assertNotNull(animSpinner);
}
错误发生在最后一行 - 例如无法找到 ID 为“spinner”的 View (因此为空)。我错误地访问了 Spinner - 有人可以建议我应该如何执行此操作吗?
我想获取 Spinner 对象以获取所选项目。
最佳答案
你可能会尝试的东西。将 Spinner 实例添加到您的设置类:
public class Setting {
private String name;
private String description;
private String[] values;
private Spinner spinner;
public Setting(String name, String description, String[] values) {
this.name = name;
this.description = description;
this.values = values;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
public String[] getValues() {
return values;
}
public void setSpinner(Spinner s) {
spinner = s;
}
public Spinner getSpinner() {
return spinner;
}
}
然后,在您的 getView() 方法中,将 Spinner 提供给您的设置实例:
ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(getContext(), R.layout.spinner_row_text_layout, setting.getValues());
spinner.setAdapter(spinnerAdapter);
if (setting.getSpinner() == null) {
setting.setSpinner(spinner);
}
然后,假设您可以访问您的设置列表,您可以访问与每个设置相关联的微调器。如果您找到带有空微调器的设置,那么它永远不会出现在 Activity 中,这意味着用户从未更改过它。但我不知道这是否真的是您想要的。
这将允许您访问每个设置的微调器,但您没有存储用户选择或在微调器中设置所选项目的逻辑。即,如果微调器有选项 A、B 和 C,并且用户选择了 B,您现在可以读取 B,但没有地方存储它。 Setting 类应该有一个用于保存所选值的字段。你的 getView() 方法应该调用 spinner.setSelection()
来告诉它显示 B 作为当前值。否则,无论用户之前选择了什么,它都会始终显示 A。
关于java - 当我将 Spinner 动态添加到 ListView 时,如何访问 Spinner 的选定项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37845735/
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
PowerShell Web Access 允许您通过 Web 浏览器运行 PowerShell cmdlet。它显示了一个基于 Web 的控制台窗口。 有没有办法运行 cmdlet 而无需在控制台窗
我尝试在无需用户登录的情况下访问 Sharepoint 文件。 我可以通过以下任一方式获取访问 token 方法一: var client = new RestClient("https://logi
我目前正在尝试通过 Chrome 扩展程序访问 Google 服务。我的理解是,对于 JS 应用程序,Google 首选的身份验证机制是 OAuth。我的应用目前已成功通过 OAuth 向服务进行身份
假设我有纯抽象类 IHandler 和派生自它的类: class IHandler { public: virtual int process_input(char input) = 0; };
我有一个带有 ThymeLeaf 和 Dojo 的 Spring 应用程序,这给我带来了问题。当我从我的 HTML 文件中引用 CSS 文件时,它们在 Firebug 中显示为中止。但是,当我通过在地
这个问题已经有答案了: JavaScript property access: dot notation vs. brackets? (17 个回答) 已关闭 6 年前。 为什么这不起作用? func
我想将所有流量重定向到 https,只有 robot.txt 应该可以通过 http 访问。 是否可以为 robot.txt 文件创建异常(exception)? 我的 .htaccess 文件: R
我遇到了 LinkedIn OAuth2: "Unable to verify access token" 中描述的相同问题;但是,那里描述的解决方案并不能解决我的问题。 我能够成功请求访问 toke
问题 我有一个暴露给 *:8080 的 Docker 服务容器. 我无法通过 localhost:8080 访问容器. Chrome /curl无限期挂断。 但是如果我使用任何其他本地IP,我就可以访
我正在使用 Google 的 Oauth 2.0 来获取用户的 access_token,但我不知道如何将它与 imaplib 一起使用来访问收件箱。 最佳答案 下面是带有 oauth 2.0 的 I
我正在做 docker 入门指南:https://docs.docker.com/get-started/part3/#recap-and-cheat-sheet-optional docker-co
我正在尝试使用静态 IP 在 AKS 上创建一个 Web 应用程序,自然找到了一个带有 Nginx ingress controller in Azure's documentation 的解决方案。
这是我在名为 foo.js 的文件中的代码。 console.log('module.exports:', module.exports) console.log('module.id:', modu
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用 MGTwitterEngine"将 twitter 集成到我的应用程序中。它在 iOS 4.2 上运行良好。当我尝试从任何 iOS 5 设备访问 twitter 时,我遇到了身份验证 to
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用以下 API 列出我的 Facebook 好友。 https://graph.facebook.com/me/friends?access_token= ??? 我想知道访问 token 过
401 Unauthorized - Show headers - { "error": { "errors": [ { "domain": "global", "reas
我已经将我的 django 应用程序部署到 heroku 并使用 Amazon s3 存储桶存储静态文件,我发现从 s3 存储桶到 heroku 获取数据没有问题。但是,当我测试查看内容存储位置时,除
我是一名优秀的程序员,十分优秀!