■概要
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}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。