2014年12月25日木曜日

AppCompat v7 の version 21 では、Fragment 入れ替えに
android.R.id.content を使ってはいけない

FragmentTransaction.replace() で android.R.id.content に MainFragment を入れる処理です。

  1. public class MainActivity extends ActionBarActivity {  
  2.   
  3.     @Override  
  4.     protected void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.   
  7.         getSupportFragmentManager()  
  8.                 .beginTransaction()  
  9.                 .replace(android.R.id.content,   
  10.                     new MainFragment(), "MainFragment")  
  11.                 .commit();  
  12.     }  
  13.   
  14.     public static class MainFragment extends ListFragment {  
  15.   
  16.         @Override  
  17.         public void onActivityCreated(Bundle savedInstanceState) {  
  18.             super.onActivityCreated(savedInstanceState);  
  19.   
  20.             setListAdapter(new ArrayAdapter<string>(getActivity(),  
  21.                     android.R.layout.simple_list_item_1,  
  22.                     android.R.id.text1,  
  23.                     new String[]{"test1""test2""test2"}));  
  24.         }  
  25.     }  
  26. }  
  27. </string>  

AppCompat v7 の version 19 だと普通に MainFragment が表示されます。
  1. apply plugin: 'com.android.application'  
  2.   
  3. android {  
  4.     compileSdkVersion 19  
  5.     buildToolsVersion "21.1.1"  
  6.   
  7.     defaultConfig {  
  8.         applicationId "net.yanzm.sample2"  
  9.         minSdkVersion 15  
  10.         targetSdkVersion 19  
  11.         versionCode 1  
  12.         versionName "1.0"  
  13.     }  
  14.     ...  
  15. }  
  16.   
  17. dependencies {  
  18.     compile fileTree(dir: 'libs', include: ['*.jar'])  
  19.     compile 'com.android.support:appcompat-v7:19.+'  
  20. }  




しかし、AppCompat v7 の version 21 にすると、でない!
  1. apply plugin: 'com.android.application'  
  2.   
  3. android {  
  4.     compileSdkVersion 21  
  5.     ...  
  6.   
  7.     defaultConfig {  
  8.         ...  
  9.         targetSdkVersion 21  
  10.         ...  
  11.     }  
  12.     ...  
  13. }  
  14.   
  15. dependencies {  
  16.     ...  
  17.     compile 'com.android.support:appcompat-v7:21.0.3'  
  18. }  


悲しみ。。。

レイアウトファイルを用意すれば表示されるけど。。。
  1. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:id="@+id/content"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.     tools:context=".MainActivity" />  
  1. public class MainActivity extends ActionBarActivity {  
  2.   
  3.     @Override  
  4.     protected void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.activity_main);  
  7.   
  8.         getSupportFragmentManager()  
  9.                 .beginTransaction()  
  10.                 .replace(R.id.content, new MainFragment(), "MainFragment")  
  11.                 .commit();  
  12.     }  
  13.   
  14.     ...  
  15. }  



バグなんだろうか。。。

↓多分同じこと言ってる http://stackoverflow.com/questions/27460502/appcompat-v7-android-5-0-actionbaractivity-textview-not-visible





追記: getSupportActionBar() を呼ぶと表示された。。。謎い。
  1. public class MainActivity extends ActionBarActivity {  
  2.   
  3.     @Override  
  4.     protected void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.   
  7.         // これを呼ぶと表示される!なぜだ!  
  8.         getSupportActionBar();  
  9.   
  10.         getSupportFragmentManager()  
  11.                 .beginTransaction()  
  12.                 .replace(android.R.id.content,   
  13.                     new MainFragment(), "MainFragment")  
  14.                 .commit();  
  15.     }  
  16.   
  17.     ...  
  18. }  



0 件のコメント:

コメントを投稿