- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在选项卡布局中制作一个简单的 Android gridView。但是,我的应用程序最终崩溃了。
这是我的 Activity ,其中包含选项卡:
EventsActivity.java
package com.grace.main;
import android.app.ActionBar;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.GridView;
public class EventsActivity extends FragmentActivity implements ActionBar.TabListener {
//needs R string
private static final String STATE_SELECTED_NAVIGATION_ITEM = "selected_navigation_item";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_events);
//Set up the action bar to show tabs
final ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
//Add a tab to the action bar
//needs R.string values
actionBar.addTab(actionBar.newTab().setText("Tab 1").setTabListener(this));
actionBar.addTab(actionBar.newTab().setText("Tab 2").setTabListener(this));
actionBar.addTab(actionBar.newTab().setText("Tab 3").setTabListener(this));
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState){
//restores the previously serialised current tab position
if (savedInstanceState.containsKey(STATE_SELECTED_NAVIGATION_ITEM)){
getActionBar().setSelectedNavigationItem(savedInstanceState.getInt(STATE_SELECTED_NAVIGATION_ITEM));
}
}
@Override
public void onSaveInstanceState(Bundle outState){
//Serialise the current tab position
outState.putInt(STATE_SELECTED_NAVIGATION_ITEM, getActionBar().getSelectedNavigationIndex());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.events, menu);
return true;
}
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
//Uses container view
Fragment fragment = new DummySectionFragment();
Bundle args = new Bundle();
args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, tab.getPosition()+1);
fragment.setArguments(args);
getFragmentManager().beginTransaction().replace(R.id.container, fragment).commit();
}
@Override
public void onTabUnselected(ActionBar.Tab tab,FragmentTransaction fragmentTransaction) {
//Do nothing
}
@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
//Do nothing
}
//dummy test
public static class DummySectionFragment extends Fragment {
public static final String ARG_SECTION_NUMBER = "placeholder_text";
GridView gridView;
static final String[] numbers1 = new String[] {
"1", "2", "3", "4", "5"
};
static final String[] numbers2 = new String[] {
"6", "7", "8", "9", "10"
};
static final String[] numbers3 = new String[] {
"11", "12", "13", "14", "15"
};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
GridView gridview = (GridView)getActivity() .findViewById(R.id.gridview);
switch (getArguments().getInt(ARG_SECTION_NUMBER)) {
case 1:
ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1, numbers1);
gridView.setAdapter(adapter1);
break;
case 2:
ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1, numbers2);
gridView.setAdapter(adapter2);
break;
case 3:
ArrayAdapter<String> adapter3 = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1, numbers3);
gridView.setAdapter(adapter3);
break;
default:
//textView.setText("HELLO");
break;
}
return gridview;
}
}
}
这是我的布局 xml:Activity_events.xml
<FrameLayout xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="capstone.DGW.Main.EventsActivity"
tools:ignore="MergeRootFrame" >
<GridView
android:id="@+id/gridview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:columnWidth="50dp"
android:gravity="center"
android:numColumns="auto_fit"
android:stretchMode="columnWidth" >
</GridView>
</FrameLayout>
我的 LogCat 错误是:
05-06 10:35:47.637: E/AndroidRuntime(16838): Caused by: java.lang.NullPointerException
05-06 10:35:47.637: E/AndroidRuntime(16838): at com.grace.main.EventsActivity$DummySectionFragment.onCreateView(EventsActivity.java:99)
05-06 10:35:47.637: E/AndroidRuntime(16838): at android.app.Fragment.performCreateView(Fragment.java:1700)
05-06 10:35:47.637: E/AndroidRuntime(16838): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)
05-06 10:35:47.637: E/AndroidRuntime(16838): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
05-06 10:35:47.637: E/AndroidRuntime(16838): at android.app.BackStackRecord.run(BackStackRecord.java:684)
05-06 10:35:47.637: E/AndroidRuntime(16838): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
05-06 10:35:47.637: E/AndroidRuntime(16838): at android.app.Activity.performStart(Activity.java:5240)
05-06 10:35:47.637: E/AndroidRuntime(16838): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2168)
05-06 10:35:47.637: E/AndroidRuntime(16838): ... 11 more
如有任何帮助,我们将不胜感激!
最佳答案
好的。所以我导入了你的代码并让它工作。
有几件事导致了困惑,因此我将粘贴工作代码并解释我更改的内容。
import android.app.ActionBar;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.GridView;
public class EventsActivity extends FragmentActivity implements ActionBar.TabListener {
//needs R string
private static final String STATE_SELECTED_NAVIGATION_ITEM = "selected_navigation_item";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_events_container);
//Set up the action bar to show tabs
final ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
//Add a tab to the action bar
//needs R.string values
actionBar.addTab(actionBar.newTab().setText("Tab 1").setTabListener(this));
actionBar.addTab(actionBar.newTab().setText("Tab 2").setTabListener(this));
actionBar.addTab(actionBar.newTab().setText("Tab 3").setTabListener(this));
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState){
//restores the previously serialised current tab position
if (savedInstanceState.containsKey(STATE_SELECTED_NAVIGATION_ITEM)){
getActionBar().setSelectedNavigationItem(savedInstanceState.getInt(STATE_SELECTED_NAVIGATION_ITEM));
}
}
@Override
public void onSaveInstanceState(Bundle outState){
//Serialise the current tab position
outState.putInt(STATE_SELECTED_NAVIGATION_ITEM, getActionBar().getSelectedNavigationIndex());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
//getMenuInflater().inflate(R.menu.events, menu);
return true;
}
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
//Uses container view
android.support.v4.app.Fragment fragment = new DummySectionFragment();
Bundle args = new Bundle();
args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, tab.getPosition()+1);
fragment.setArguments(args);
getSupportFragmentManager().beginTransaction().replace(R.id.events_container, fragment).commit();
//getSupportFragmentManager().beginTransaction()
//.add(R.id.assessment_container, fragment).commit();
}
@Override
public void onTabUnselected(ActionBar.Tab tab,FragmentTransaction fragmentTransaction) {
//Do nothing
}
@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
//Do nothing
}
//dummy test
public static class DummySectionFragment extends Fragment {
public static final String ARG_SECTION_NUMBER = "placeholder_text";
GridView gridView;
static final String[] numbers1 = new String[] {
"1", "2", "3", "4", "5"
};
static final String[] numbers2 = new String[] {
"6", "7", "8", "9", "10"
};
static final String[] numbers3 = new String[] {
"11", "12", "13", "14", "15"
};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_events,
container, false);
GridView gridview = (GridView)rootView.findViewById(R.id.gridview);
switch (getArguments().getInt(ARG_SECTION_NUMBER)) {
case 1:
ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1, numbers1);
gridview.setAdapter(adapter1);
break;
case 2:
ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1, numbers2);
gridview.setAdapter(adapter2);
break;
case 3:
ArrayAdapter<String> adapter3 = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1, numbers3);
gridview.setAdapter(adapter3);
break;
default:
//textView.setText("HELLO");
break;
}
return rootView;
}
}
}
根据我的经验, fragment 和 Activity 有着特殊的关系。我总是用两个布局 xml 文件来设计 fragment/Activity 关系;一个简单的 Activity 容器和一个显示大部分内容的 fragment 容器。
这是一个简单的 Activity 布局,名为activity_events_layout.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/events_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
记下 id/events_container。该引用在 fragment 事务期间使用。现在进入布局fragment_events.xml:
<FrameLayout xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="capstone.DGW.Main.EventsActivity"
tools:ignore="MergeRootFrame" >
<GridView
android:id="@+id/gridview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:columnWidth="50dp"
android:gravity="center"
android:numColumns="auto_fit"
android:stretchMode="columnWidth" >
</GridView>
</FrameLayout>
这是包含 Gridview 的 fragment 。
现在回到代码。创建 fragment 时,首先需要膨胀布局,然后可以在该 View 上调用 findViewById 来访问 subview 。然后为 onCreateView 方法返回膨胀的 View 。
另一件事,我一直在 support.v4.app.Fragment 和 supportFragmentManager 方面取得成功,所以我也对其进行了修改。
关于java - NullPointEreException 选项卡布局 GridView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23484179/
给定一个 Option[Future[Option[Int]]] : scala> val x: Option[Future[Option[Int]]] = Some ( Future ( Some
如果我理解正确,EitherT[Option,A,B] 应该与 Option[Either[A,B]] 相同,但编译器不同意.以下代码编译失败: def f[A,B] = implicitly[Eit
我刚开始在使用 parcel.js 构建静态 Assets 时遇到此错误。它在本地工作,但我在 Heroku 上的构建出错,我不确定它是否相关。 最佳答案 得到同样的问题。通过将 core-js 安装
当我生成 Telerik Report 时,只有 Export PDF 可用。即使我将 docx 和 xlsx 的配置设置为 true。这是我在网络配置中的配置。
我的 iTunesConnect 应用程序显示 Apple Pay 选项。我正在使用布伦特里。 即使我们没有在应用程序中使用 Apple Pay 功能。 有人可以帮我解决如何在我的 itunesCon
我正在 Raspbian 中从命令行运行以下查询: mysql -u $NAME -p $PASS Tweets -e "SELECT count(*) FROM raw_tweets;" 它输出以下
我正在尝试使用 ffmpeg(在 linux 下)为视频添加一个小标题。所以,我使用: ffmpeg -i hk.avi -r 30000/1001 -metadata title="SOF" hk_
我正在尝试使用 ffmpeg 使用 ffserver 流式传输视频。您将在 ffserver1.conf 文件下方找到 ffmpeg 命令的日志输出。 其中一个错误引用了预设,每次我尝试使用预设时,我
我正在尝试对 Option 使用 fold 或 map 操作而不是 match。 我有一个选项 val ao: Option[String] = xxxx 和一个函数 f: (String => Fu
Dockerfile documentation表示有可能通过 --platform FROM 中的选项像这样的指令: FROM [--platform=] [AS ] 在我的 dockerfile
我不确定“属性(property)”或“选项”是否是正确的术语,但这是我需要弄清楚的。 鉴于以下情况: ' $.fileup({ url: '/file/upload',
我正在尝试使用 jQuery 检查是否选择了值 = 1 的选择选项,然后将类添加到某些元素。但有些东西不起作用。可以请人看一下代码吗? 我的代码: Reservation
我对 VIM 中的这些感到困惑。有些事情需要设置,而另一些则让。 而且,我如何检查某个选项。我知道这是一个选项,因为我使用 set 来更改它。 例如,如何检查当前文件类型选项是否为 java? 最佳答
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
我在看《Professional F# 2.0》一书作者展示如下代码 let a string : option = None if a.IsNone then System.Console.
我习惯使用方法顶部的 java 样板检查输入参数: public static Boolean filesExist(String file1, String file2, String file3
假设我有一串 "Insert Post -title Some PostTitle -category 2 -date-posted 2013-02:02 10:10:10" 我一直在尝试做的是将这个
从 1.3.70 EAP 开始,在 org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions 这是 var useIR: kotlin.Boolean 哪个激活
我无法获取订购捆绑商品的所有子产品及其选项。这可能吗? 最佳答案 以下是您如何找出哪些产品应与所有其他项目一起附加到列表中的捆绑产品中的方法: foreach ($order->getAllItems
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
我是一名优秀的程序员,十分优秀!