質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

3回答

2351閲覧

Android TabHostについて

TakamasaAwai

総合スコア73

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2015/07/10 15:18

lang

1public class MainActivity extends FragmentActivity { 2 ViewPager viewPager; 3 TabHost tabHost; 4 View indicator; 5 TabWidget tabWidget; 6 7 @Override 8 protected void onCreate(Bundle savedInstanceState) { 9 super.onCreate(savedInstanceState); 10 setContentView(R.layout.activity_main); 11 //マテリアルデザインの作業 12 tabWidget = (TabWidget) findViewById(android.R.id.tabs); 13 tabWidget.setStripEnabled(false); 14 tabWidget.setShowDividers(LinearLayout.SHOW_DIVIDER_NONE); 15 indicator = findViewById(R.id.indicator); 16 getActionBar().setElevation(0); //TabとActionBarとの間の影を消す 17 18 float elevation = 4 * getResources().getDisplayMetrics().density; 19 tabHost.setElevation(elevation); 20 21 viewPager.setOnPageChangeListener(new PageChangeListener()); 22 23 //PagerとTabの設定 24 ViewPagerAdapter vpa = new ViewPagerAdapter(getSupportFragmentManager()); 25 viewPager = (ViewPager) findViewById(R.id.pager); 26 viewPager.setAdapter(vpa); 27 28 tabHost = (TabHost) findViewById(android.R.id.tabhost); 29 tabHost.setup(); 30 31 LayoutInflater inflater = LayoutInflater.from(this); 32 for (int i = 0; i < vpa.getCount(); i++) { 33 TextView tv = (TextView) inflater.inflate(R.layout.tab_widget, tabWidget, false); 34 tv.setText(vpa.getPageTitle(i)); 35 tabHost.addTab(tabHost 36 .newTabSpec(String.valueOf(i)) 37 .setIndicator(vpa.getPageTitle(i)) 38 .setContent(android.R.id.tabcontent)); 39 } 40 41 tabHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() { 42 @Override 43 public void onTabChanged(String tabId) { 44 viewPager.setCurrentItem(Integer.valueOf(tabId)); 45 } 46 }); 47 48 viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 49 @Override 50 public void onPageSelected(int position) { 51 super.onPageSelected(position); 52 tabHost.setCurrentTab(position); 53 } 54 }); 55 } 56 57 private class PageChangeListener implements ViewPager.OnPageChangeListener { 58 private int scrollingState = ViewPager.SCROLL_STATE_IDLE; 59 60 @Override 61 public void onPageSelected(int position) { 62 // スクロール中はonPageScrolled()で描画するのでここではしない 63 if (scrollingState == ViewPager.SCROLL_STATE_IDLE) { 64 updateIndicatorPosition(position, 0); 65 } 66 tabWidget.setCurrentTab(position); 67 } 68 69 @Override 70 public void onPageScrollStateChanged(int state) { 71 scrollingState = state; 72 } 73 74 @Override 75 public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 76 updateIndicatorPosition(position, positionOffset); 77 } 78 79 private void updateIndicatorPosition(int position, float positionOffset) { 80 View tabView = tabWidget.getChildTabViewAt(position); 81 int indicatorWidth = tabView.getWidth(); 82 int indicatorLeft = (int) ((position + positionOffset) * indicatorWidth); 83 84 final FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) indicator.getLayoutParams(); 85 layoutParams.width = indicatorWidth; 86 layoutParams.setMargins(indicatorLeft, 0, 0, 0); 87 indicator.setLayoutParams(layoutParams); 88 } 89 } 90}

このコードで実行すると落ちます。どこがおかしいですか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2015/07/10 15:21

Logcatのログを載せて下さい.
TakamasaAwai

2015/07/10 15:23

logcatは 07-10 11:23:09.890 8675-8675/com.example.takamasaawai.myapplication I/art﹕ Late-enabling -Xcheck:jni 07-10 11:23:09.958 8675-8675/com.example.takamasaawai.myapplication D/AndroidRuntime﹕ Shutting down VM 07-10 11:23:09.959 8675-8675/com.example.takamasaawai.myapplication E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.example.takamasaawai.myapplication, PID: 8675 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.takamasaawai.myapplication/com.example.takamasaawai.myapplication.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TabHost.setElevation(float)' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) at android.app.ActivityThread.access$800(ActivityThread.java:151) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5254) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TabHost.setElevation(float)' on a null object reference at com.example.takamasaawai.myapplication.MainActivity.onCreate(MainActivity.java:33) at android.app.Activity.performCreate(Activity.java:5990) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)             at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)             at android.app.ActivityThread.access$800(ActivityThread.java:151)             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)             at android.os.Handler.dispatchMessage(Handler.java:102)             at android.os.Looper.loop(Looper.java:135)             at android.app.ActivityThread.main(ActivityThread.java:5254)             at java.lang.reflect.Method.invoke(Native Method)             at java.lang.reflect.Method.invoke(Method.java:372)             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) です。長くてすみません。
TakamasaAwai

2015/07/10 15:25

mainactivityの33行目は tabHost.setElevation(elevation); です。
guest

回答3

0

ベストアンサー

ちょこちょこ出てきてすみません笑
LiT!のごっちゃんです!

lang

1 float elevation = 4 * getResources().getDisplayMetrics().density; 2 tabHost.setElevation(elevation); 3 4 viewPager.setOnPageChangeListener(new PageChangeListener()); 5 6 //PagerとTabの設定 7 ViewPagerAdapter vpa = new ViewPagerAdapter(getSupportFragmentManager()); 8 viewPager = (ViewPager) findViewById(R.id.pager); 9 viewPager.setAdapter(vpa); 10 11 tabHost = (TabHost) findViewById(android.R.id.tabhost); 12 tabHost.setup();

この部分ですが、tabHostの定義が後になってますね。
tabHost = (TabHost) findViewById(android.R.id.tabhost);
この行を、
float elevation = 4 * getResources().getDisplayMetrics().density;
tabHost.setElevation(elevation);
この部分より、上に書きましょう。

findViewByIdなどの定義は必ず最初にするようにするといいと思います。

専用のメソッドを作って、onCreateの一番上に書くと間違いがないと僕は思っています。

具体的には、

lang

1 tabHost = (TabHost) findViewById(android.R.id.tabhost); 2 3 float elevation = 4 * getResources().getDisplayMetrics().density; 4 tabHost.setElevation(elevation); 5 6 viewPager.setOnPageChangeListener(new PageChangeListener()); 7 8 //PagerとTabの設定 9 ViewPagerAdapter vpa = new ViewPagerAdapter(getSupportFragmentManager()); 10 viewPager = (ViewPager) findViewById(R.id.pager); 11 viewPager.setAdapter(vpa); 12 13 tabHost.setup();

こうですかね。

投稿2015/07/10 15:38

RitsukiGoto

総合スコア99

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TabHost.setElevation(float)' on a null object reference

android.widget.TabHost.setElevation(float)というメソッドを,nullオブジェクトに対して実行したことが原因です.
コードを見てみると,tabHost.setElevation(elevation);の前にtabHostにオブジェクトを入れる操作がないので,tabHostがnullのままです.

投稿2015/07/10 15:33

swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

最初の方の

lang

1viewPager.setOnPageChangeListener(new PageChangeListener());

この部分ですが、まだviewPagerが初期化されていません。
ですので、いわゆるnull pointer exceptionが発生して落ちていると思います。

lang

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

の後に移動させればよいですね。

投稿2015/07/10 15:25

terushu

総合スコア358

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakamasaAwai

2015/07/10 15:28

ありがとうございます。確かにそこはおかしいと思いました。しかし、 tabHost.setElevation(elevation); のところが怒られています。
swordone

2015/07/10 15:34

そこまでわかってて,なぜわからない・・・?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問