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

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

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

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

Q&A

解決済

1回答

1823閲覧

SearchViewの虫眼鏡を押すとレイアウトがズレておかしくなる

tarofess

総合スコア127

Android

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

0グッド

0クリップ

投稿2015/10/20 01:41

画面が起動した後、画面にあるSearchViewの虫眼鏡を押すとレイアウトがズレることなくキーボードが表示されるのですが、現在画面の上にはタブがあり、そのタブを押して画面が切り替わった後再びSearchViewがある画面に戻り虫眼鏡を押すと、レイアウトがズレてしまいます。症状は以下のような感じです。
イメージ説明

タブの切り替えにFragmentを使っているのでそれが原因なのではないかと思っているのですが、色々と調べてみても解決方法がわかりません。
下記にソースコードを記しますので、どなたかわかる方がいれば教えていただきたいです。
すみませんが、宜しくお願いします。

Java

1MainActivity 2 3@Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_main); 7 8 setTab(); 9 } 10 11 public void setTab() { 12 FragmentTabHost tabHost = (FragmentTabHost)findViewById(android.R.id.tabhost); { 13 tabHost.setup(this, getSupportFragmentManager(), R.id.container); 14 15 TabHost.TabSpec productTab, cartTab, settingTab; 16 17 productTab = tabHost.newTabSpec("Product"); 18 productTab.setIndicator("商品"); 19 tabHost.addTab(productTab, IPProductFragment.class, null); 20 21 cartTab = tabHost.newTabSpec("Cart"); 22 cartTab.setIndicator("カート"); 23 tabHost.addTab(cartTab, IPCartFragment.class, null); 24 25 settingTab = tabHost.newTabSpec("Setting"); 26 settingTab.setIndicator("設定"); 27 tabHost.addTab(settingTab, IPSettingFragment.class, null); 28 29 tabHost.setOnTabChangedListener(this); 30 } 31 } 32 33 @Override 34 public void onTabChanged(String tabId) { 35 FragmentManager fragmentManager = getSupportFragmentManager(); 36 FragmentTransaction transaction = fragmentManager.beginTransaction(); 37 38 switch (tabId) { 39 case "Product": 40 transaction.replace(R.id.container, new IPProductFragment()); 41 42 break; 43 case "Cart": 44 transaction.replace(R.id.container, new IPCartFragment()); 45 46 break; 47 case "Setting": 48 transaction.replace(R.id.container, new IPSettingFragment()); 49 50 break; 51 } 52 53 transaction.commit(); 54 } 55 56//////////////////////////////////////////////////////////////////////////////////// 57 58public class IPProductFragment extends Fragment implements SearchView.OnQueryTextListener { 59 private List<IPProductData> products = new ArrayList<>(); 60 private IPProductGridViewAdapter adapter; 61 62 @Override 63 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 64 View v = inflater.inflate(R.layout.fragment_product, container, false); 65 66 setHasOptionsMenu(true); 67 68 setProducts(); 69 setSearchBar(v); 70 setGridView(v); 71 72 return v; 73 } 74 75 @Override 76 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 77 super.onCreateOptionsMenu(menu, inflater); 78 } 79 80 public void setSearchBar(View v) { 81 SearchView searchView = (SearchView)v.findViewById(R.id.searchView); { 82 searchView.setIconifiedByDefault(true); 83 searchView.setOnQueryTextListener(this); 84 searchView.setSubmitButtonEnabled(false); 85 searchView.setQueryHint("検索"); 86 } 87 } 88 89 public void setProducts() { 90 IPProductData productData1 = new IPProductData(); { 91 productData1.setProductImage(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher)); 92 productData1.setProductText("ハンバーガー"); 93 } 94 IPProductData productData2 = new IPProductData(); { 95 productData2.setProductImage(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher)); 96 productData2.setProductText("ポテト"); 97 } 98 IPProductData productData3 = new IPProductData(); { 99 productData3.setProductImage(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher)); 100 productData3.setProductText("コーラ"); 101 } 102 IPProductData productData4 = new IPProductData(); { 103 productData4.setProductImage(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher)); 104 productData4.setProductText("チキンナゲット"); 105 } 106 107 products.clear(); 108 products.add(productData1); 109 products.add(productData2); 110 products.add(productData3); 111 products.add(productData4); 112 } 113 114 public void setGridView(View v) { 115 GridView gridView = (GridView)v.findViewById(R.id.gridViewProductItem); { 116 adapter = new IPProductGridViewAdapter(getContext(), R.layout.gridview_item_product, products); 117 gridView.setAdapter(adapter); 118 } 119 } 120 121 @Override 122 public boolean onQueryTextSubmit(String query) { 123 return false; 124 } 125 126 @Override 127 public boolean onQueryTextChange(String newText) { 128 adapter.getFilter().filter(newText); 129 130 return false; 131 } 132} 133 134//////////////////////////////////////////////////////////////////////////////////// 135 136public class IPProductGridViewAdapter extends ArrayAdapter<IPProductData> { 137 private LayoutInflater mLayoutInflater; 138 139 public IPProductGridViewAdapter(Context context, int resource, List objects) { 140 super(context, resource, objects); 141 142 mLayoutInflater = LayoutInflater.from(context); 143 } 144 145 @Override 146 public View getView(int position, View convertView, ViewGroup parent) { 147 148 if (convertView == null) { 149 convertView = mLayoutInflater.inflate(R.layout.gridview_item_product, null); 150 } 151 152 ImageView productImageView = (ImageView)convertView.findViewById(R.id.imageViewProductGridView); { 153 productImageView.setImageBitmap(IPProductGridViewAdapter.this.getItem(position).getProductImage()); 154 } 155 TextView productTextView = (TextView)convertView.findViewById(R.id.textViewProductGridView); { 156 productTextView.setText(IPProductGridViewAdapter.this.getItem(position).getProductText()); 157 } 158 159 return convertView; 160 } 161} 162 163//////////////////////////////////////////////////////////////////////////////////// 164 165public class IPProductData { 166 private Bitmap mProductImage; 167 private String mProductText; 168 169 public Bitmap getProductImage() { 170 return mProductImage; 171 } 172 173 public String getProductText() { 174 return mProductText; 175 } 176 177 public void setProductImage(Bitmap productImage) { 178 this.mProductImage = productImage; 179 } 180 181 public void setProductText(String productText) { 182 this.mProductText = productText; 183 } 184}

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

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

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

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

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

guest

回答1

0

ベストアンサー

推測ですが、FragmentTabHostはタブとフラグメントインスタンスの関連付けを内部的に保持しているのではないでしょうか。質問者のコードではタブ切り替えのたびに新しいフラグメントインスタンスを追加するようになっているため、新旧のフラグメントが二重に表示されているのではないでしょうか。
検索してみると質問者のコードは一般的な使い方とは異なっているようです。下記のサイトの実装方法に変更してみてはいかがでしょうか。
FragmentTabHostの使い方

投稿2015/10/20 03:43

yona

総合スコア18155

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

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

tarofess

2015/10/20 06:43

ご回答ありがとうございます。 tabHost.setOnTabChangedListener(this); の行と onTabChangedメソッドを削除することでタブが重ならなくなりました! タブを切り替えるにはリスナーを登録して、タブが変わる時にそのハンドラ内でフラグメントをreplaceしなければタブが切り替わらないと勘違いしていました。 誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問