【问题标题】:Thread Exiting With Uncaught Expression线程以未捕获的表达式退出
【发布时间】:2015-04-08 10:24:13
【问题描述】:

我有一个应用程序,它由带有菜单列表的简单抽屉导航组成。 在其中一个菜单中,我想添加一个带有标签布局的页面 - 在this 上找到的可滑动视图 - 此应用正在运行且没有任何错误。

我决定在其中一个菜单中放置一个按钮,按下该按钮时会将用户引导至 TabLayout 的 MainActivity。

现在在我的主项目中,我有两个 MainActivity 类,一个是 MainActivity.java(这是 NavDrawer 的)和 MainActivity2.java(这是 TabLayout 的),我还设法将所有需要的文件复制粘贴到我的主项目,包括适配器。

我将按钮放在我的 HomeFragment.java 中,如下所示:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_home, container, false);
        Button mButton = (Button) rootView.findViewById(R.id.button1);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // here you set what you want to do when user clicks your button,
                Intent intent = new Intent(getActivity(), MainActivity2.class);
                startActivity(intent);
            }
        });
        return rootView;
    }
}

但不幸的是,当我单击按钮时,应用程序崩溃并显示此 logcat

04-08 05:58:52.106: E/AndroidRuntime(1317): FATAL EXCEPTION: main
04-08 05:58:52.106: E/AndroidRuntime(1317): Process: my.jlm, PID: 1317
04-08 05:58:52.106: E/AndroidRuntime(1317): java.lang.RuntimeException: Unable to start activity ComponentInfo{my.jlm/my.jlm.MainActivity2}: java.lang.NullPointerException
04-08 05:58:52.106: E/AndroidRuntime(1317):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2176)
04-08 05:58:52.106: E/AndroidRuntime(1317):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)
04-08 05:58:52.106: E/AndroidRuntime(1317):     at android.app.ActivityThread.access$700(ActivityThread.java:135)
04-08 05:58:52.106: E/AndroidRuntime(1317):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
04-08 05:58:52.106: E/AndroidRuntime(1317):     at android.os.Handler.dispatchMessage(Handler.java:102)
04-08 05:58:52.106: E/AndroidRuntime(1317):     at android.os.Looper.loop(Looper.java:137)
04-08 05:58:52.106: E/AndroidRuntime(1317):     at android.app.ActivityThread.main(ActivityThread.java:4998)
04-08 05:58:52.106: E/AndroidRuntime(1317):     at java.lang.reflect.Method.invokeNative(Native Method)
04-08 05:58:52.106: E/AndroidRuntime(1317):     at java.lang.reflect.Method.invoke(Method.java:515)
04-08 05:58:52.106: E/AndroidRuntime(1317):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
04-08 05:58:52.106: E/AndroidRuntime(1317):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
04-08 05:58:52.106: E/AndroidRuntime(1317):     at dalvik.system.NativeStart.main(Native Method)
04-08 05:58:52.106: E/AndroidRuntime(1317): Caused by: java.lang.NullPointerException
04-08 05:58:52.106: E/AndroidRuntime(1317):     at my.jlm.MainActivity2.onCreate(MainActivity2.java:32)

它说错误可能是由第 32 行的 MainActivity2.java 引起的,但我不知道如何处理它

这是第 32 行

viewPager.setAdapter(mAdapter);

这是我完整的 MainActivity2

public class MainActivity2 extends FragmentActivity implements
ActionBar.TabListener {

private ViewPager viewPager;
private TabsPagerAdapter mAdapter;
private ActionBar actionBar;
// Tab titles
private String[] tabs = { "Top Rated", "Games", "Movies" };

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// Initilization
viewPager = (ViewPager) findViewById(R.id.pager);
actionBar = getActionBar();
mAdapter = new TabsPagerAdapter(getSupportFragmentManager());

viewPager.setAdapter(mAdapter);
actionBar.setHomeButtonEnabled(false);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);        

// Adding Tabs
for (String tab_name : tabs) {
    actionBar.addTab(actionBar.newTab().setText(tab_name)
            .setTabListener(this));
}

/**
 * on swiping the viewpager make respective tab selected
 * */
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

    @Override
    public void onPageSelected(int position) {
        // on changing the page
        // make respected tab selected
        actionBar.setSelectedNavigationItem(position);
    }

    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) {
    }

    @Override
    public void onPageScrollStateChanged(int arg0) {
    }
});
}

@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}

@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
// on tab selected
// show respected fragment view
viewPager.setCurrentItem(tab.getPosition());
}

@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}

}

感谢您的宝贵时间。

【问题讨论】:

  • 你试过getSupportActionBar(); 吗?而不是getActionBar()
  • 可能你的适配器是空的

标签: android android-intent android-fragments uncaught-exception


【解决方案1】:

viewPagernull。你像这样初始化它:

viewPager = (ViewPager) findViewById(R.id.pager);

findViewById 如果找到则返回视图,否则返回null

公共视图 findViewById (int id) 在 API 级别 1 中添加

从 XML 中查找由 id 属性标识的视图 在 onCreate(Bundle) 中处理。返回

The view if found or null otherwise.

Source.

您的问题是未找到该视图,可能是因为它尚未创建(还)。

【讨论】:

  • 谢谢。您的帖子启发了我,我为 MainActivity2.java 放置了错误的布局,因为它应该是“寻呼机”的新 activity_main2.xml 而不是 activity_main.xml(我现有的活动布局),其中没有寻呼机 ID。
  • 我很高兴它有帮助。
猜你喜欢
  • 2013-04-11
  • 2017-10-01
  • 1970-01-01
  • 2015-04-19
  • 1970-01-01
  • 2016-02-09
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多