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

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

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

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

Android

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

304閲覧

Android Studio)MainActivityに処理を残したままFragmentTabHostを使用したい

akai_kinomi

総合スコア18

Java

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

Android

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2019/03/26 06:56

■概要
Android Studio を使用してアンドロイドアプリを使用しています。
アクティビティ1つ(MainActivity)で完結させていましたが、
タブで複数の画面を使用したいと考えて、フラグメントの導入を考えています。

現状すべての処理がMainActivityにあるため、
変更を少なくするためにもMainActivityをそのまま残したうえで、Flagmentを追加したいです。

■目標
現状のMainActivityに加えて、フラグメントを1つ追加し(FragmentA)、
以下のようにしたいです。

・MainActivity←tabHost
・FragmentA

■現状
http://k-1-ne-jp.blogspot.com/2013/11/fragmenttabhost.html
等ブログを参考に、TabHostを使用したソースを作成しました。

・MainActivity(フラグメントを呼び出すだけ)←tabHost
・FragmentA
・FragmentB

■問題
下記のように変更すればどうかと思ったのですが、
ビルドは通りますが起動すると落ちてしまいます。
mTabHost.addTab(mTabSpec1, Fragment1MainActivity.class, args);
mTabHost.addTab(mTabSpec2, Fragment2.class, args);

mTabSpec1にMainActivityを設定するにはどのようにすればよいのでしょうか。

エラーメッセージ
2019-03-26 15:55:34.308 10431-10431/co.jp.sabtest E/AndroidRuntime: FATAL EXCEPTION: main
Process: co.jp.sabtest, PID: 10431
java.lang.ClassCastException: co.jp.sabtest.MainActivity cannot be cast to android.support.v4.app.Fragment
at android.support.v4.app.Fragment.instantiate(Fragment.java:443)
at android.support.v4.app.FragmentTabHost.doTabChanged(FragmentTabHost.java:349)
at android.support.v4.app.FragmentTabHost.onAttachedToWindow(FragmentTabHost.java:287)
at android.view.View.dispatchAttachedToWindow(View.java:18347)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3397)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3404)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3404)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3404)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3404)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3404)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1761)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1460)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7183)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
at android.view.Choreographer.doCallbacks(Choreographer.java:761)
at android.view.Choreographer.doFrame(Choreographer.java:696)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

MainActivity.java

1import android.os.Bundle; 2import android.support.v4.app.FragmentManager; 3import android.support.v4.app.FragmentTabHost; 4import android.support.v7.app.AppCompatActivity; 5import android.widget.TabHost.TabSpec; 6 7 public class MainActivity extends AppCompatActivity { 8 9 private FragmentTabHost mTabHost; 10 private String[] TabTag = { "Dice", "Character"}; 11 12 @Override 13 protected void onCreate(Bundle savedInstanceState) { 14 super.onCreate(savedInstanceState); 15 setContentView(R.layout.activity_main); 16 17 //FragmentManagerの取得 18 FragmentManager mFragmentManager = getSupportFragmentManager(); 19 20 // FragmentTabHostを取得する 21 mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost); 22 23 // Context、FragmentManager、タブ選択時にFragmentを挿入するリソースID 24 mTabHost.setup(this, getSupportFragmentManager(), R.id.content); 25 26 //String型の引数には任意のidを渡す 27 //今回は2つのFragmentをFragmentTabHostから切り替えるため、2つのTabSpecを用意する 28 TabSpec mTabSpec1 = mTabHost.newTabSpec("tab1"); 29 TabSpec mTabSpec2 = mTabHost.newTabSpec("tab2"); 30 31 //Tab上に表示する文字を渡す 32 mTabSpec1.setIndicator("This is tab1"); 33 mTabSpec2.setIndicator("This is tab2"); 34 35 Bundle args = new Bundle(); 36 args.putString("string", "message"); 37 38 mTabHost.addTab(mTabSpec1, Fragment1.class, args); 39 mTabHost.addTab(mTabSpec2, Fragment2.class, args); 40 41 } 42}

flagment1.java

1import android.os.Bundle; 2import android.support.annotation.Nullable; 3import android.support.v4.app.Fragment; 4import android.support.v4.app.FragmentManager; 5import android.support.v4.app.FragmentTransaction; 6import android.view.Gravity; 7import android.view.LayoutInflater; 8import android.view.View; 9import android.view.ViewGroup; 10import android.widget.Button; 11import android.widget.TextView; 12 13/* 14 * タブがクリックされた時に表示するFragment 15 */ 16public class Fragment1 extends Fragment { 17 boolean flag = true; 18 TextView textView; 19 String text; 20 @Override 21 public void onCreate(Bundle savedInstanceState){ 22 super.onCreate(savedInstanceState); 23 24 //addTabの際にBundleを渡す場合は、Bundleから値を取得する 25 //渡さない(nullを渡している)場合は、実装しなくてよい。そうでないとgetString("string")時にエラーが発生する 26 Bundle args = getArguments(); 27 String str = args.getString("string"); 28 } 29 30 @Nullable 31 @Override 32 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 33 View v = inflater.inflate(R.layout.fragment1, null); 34 35 //一回Viewを取り外す 36 container.removeAllViews(); 37 38 Button button = v.findViewById(R.id.button); 39 // TextView の設定 40 textView = v.findViewById(R.id.text_view); 41 if (savedInstanceState != null) { 42 text = savedInstanceState.getString("textView"); 43 textView.setText(text); 44 } 45 button.setOnClickListener(new View.OnClickListener() { 46 @Override 47 public void onClick(View view) { 48 // flagがtrueの時 49 50 if (flag) { 51 //textView.setText(R.string.hello); 52 text = ("Hello"); 53 textView.setText(text); 54 55 flag = false; 56 } 57 // flagがfalseの時 58 else { 59 //textView.setText(R.string.world); 60 text = ("World"); 61 textView.setText(text); 62 flag = true; 63 } 64 } 65 }); 66 67 68 return v; 69 } 70 @Override 71 public void onSaveInstanceState(Bundle outState) { 72 super.onSaveInstanceState(outState); 73 outState.putString("textView", text ); 74 } 75// static public void setTextEdit(String text){ 76// co.jp.sabtest.Fragment1.textView.setText(text); 77// } 78 79}

flagment2.java

1 2import android.os.Bundle; 3import android.support.annotation.Nullable; 4import android.support.v4.app.Fragment; 5import android.view.LayoutInflater; 6import android.view.View; 7import android.view.ViewGroup; 8import android.widget.Button; 9import android.widget.EditText; 10import android.widget.TextView; 11 12/* 13 * タブがクリックされた時に表示するFragment 14 */ 15public class Fragment2 extends Fragment { 16 EditText editText; 17 TextView textView; 18 String textE; 19 String textT; 20 @Override 21 public void onCreate(Bundle savedInstanceState){ 22 super.onCreate(savedInstanceState); 23 24 //addTabの際にBundleを渡す場合は、Bundleから値を取得する 25 //渡さない(nullを渡している)場合は、実装しなくてよい。そうでないとgetString("string")時にエラーが発生する 26 Bundle args = getArguments(); 27 String str = args.getString("string"); 28 } 29 30 @Nullable 31 @Override 32 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 33 View v = inflater.inflate(R.layout.fragment2, null); 34 // エディットテキストのテキストを取得 35 editText = v.findViewById(R.id.edit_text); 36 Button button = v.findViewById(R.id.buttonSend); 37 textView = v.findViewById(R.id.text_view2); 38 39 if (savedInstanceState != null) { 40 textE = savedInstanceState.getString("editText"); 41 textView.setText(textT); 42 } 43 // 取得したテキストを TextView に張り付ける 44 45 button.setOnClickListener(new View.OnClickListener() { 46 @Override 47 public void onClick(View v) { 48 // エディットテキストのテキストを取得 49 String text = editText.getText().toString(); 50 // 取得したテキストを TextView に張り付ける 51 textView.setText(text); 52 textT = text; 53 } 54 }); 55 56 // Fragment1.setTextEdit(text); 57 58 59 return v; 60 } 61 @Override 62 public void onSaveInstanceState(Bundle outState) { 63 super.onSaveInstanceState(outState); 64 outState.putString("editText", textE ); 65 outState.putString("textView", textT ); 66 } 67}

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

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

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

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

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

guest

回答1

0

自己解決

他の方法を試すことにしました。

投稿2019/03/26 08:21

akai_kinomi

総合スコア18

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問