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

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

ただいまの
回答率

90.48%

  • Java

    14116questions

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

全て「商品」と同じ表示にしたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 257

syyyow

score 16

少し長くなります。また文章が
わからない箇所もあるかと思いますが
どうぞよろしくお願いいたします。

現在、android studioでショッピングサイトの作成をしております。
BottomNavigationViewにて作成しているのですが
下に表示されるアイコンの大きさを均等にする方法を教えていただきたいです。

写真のように[商品]だけが大きく表示されてしまいます。

イメージ説明

当方が書いてきたコードは以下です。
MaimActivity.java
↓↓↓↓↓↓↓↓↓↓↓↓↓

import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private TextView mTextMessage;

    private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
            = new BottomNavigationView.OnNavigationItemSelectedListener() {

        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch (item.getItemId()) {
                case R.id.navigation_product:
                    mTextMessage.setText(R.string.title_product);
                    return true;
                case R.id.navigation_cart:
                    mTextMessage.setText(R.string.title_cart);
                    return true;
                case R.id.navigation_delivery_status:
                    mTextMessage.setText(R.string.title_delivery_status);
                    return true;
                case R.id.navigation_mypage:
                    mTextMessage.setText(R.string.title_mypage);
                    return true;
                case R.id.navigation_other:
                    mTextMessage.setText(R.string.title_other);
                    return true;
            }
            return false;
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTextMessage = (TextView) findViewById(R.id.message);
        BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
        navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
    }
}

Activity Main
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <android.support.design.widget.BottomNavigationView
        android:id="@+id/navigation"
        android:layout_width="0dp"
        android:layout_height="59dp"
        android:background="?android:attr/windowBackground"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:menu="@menu/navigation" />

</android.support.constraint.ConstraintLayout>

navigation.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/navigation_product"
        android:icon="@drawable/ic_home_black_24dp"
        android:title="商品" />

    <item
        android:id="@+id/navigation_cart"
        android:icon="@drawable/ic_shopping_cart_black_24dp"
        android:title="カート" />

    <item
        android:id="@+id/navigation_delivery_status"
        android:icon="@drawable/ic_local_shipping_black_24dp"
        android:title="配送状況" />

    <item
        android:id="@+id/navigation_mypage"
        android:icon="@drawable/ic_person_black_24dp"
        android:title="マイページ" />

    <item
        android:id="@+id/navigation_other"
        android:icon="@drawable/ic_settings_black_24dp"
        android:title="その他" />


</menu>


手順①
[4つ以上のアイテムを均等の大きさで並べる] 
4つ以上のアイテムを均等に並べるにはレイアウトをごにょごにょする必要があるが、今回はBottomNavigationViewを継承してBottomNavigationViewの独自クラスをするのではなく
「BottomNavigationViewHelper」というヘルパークラスを作成してBottomNavigationViewを作るときにレイアウトを調整する。

BottomNavigationViewHelperを新規に作成する
こちらがwebからみつけだしたコードなのですが
どう変更したら良いか教え頂けますと幸いです。

package com.myapp.myapp;

import android.support.design.internal.BottomNavigationItemView;
import android.support.design.internal.BottomNavigationMenuView;
import android.support.design.widget.BottomNavigationView;

import java.lang.reflect.Field;

public class BottomNavigationViewHelper {

    /**
     * BottomNavigationViewのアイテムのサイズの調整、アイコンサイズ調整、タイトルの削除
     *
     * @param view
     */
    public static void disableShiftMode(BottomNavigationView view) {
        BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0);
        try {

            Field shiftingMode = menuView.getClass().getDeclaredField("mShiftingMode");
            shiftingMode.setAccessible(true);
            shiftingMode.setBoolean(menuView, false);
            shiftingMode.setAccessible(false);

            for (int i = 0; i < menuView.getChildCount(); i++) {

                /**
                 * アイテムの幅調整
                 */
                BottomNavigationItemView bottomNavigationItemView = (BottomNavigationItemView) menuView.getChildAt(i);
                // noinspection RestrictedApi
                bottomNavigationItemView.setShiftingMode(false);
                // チェックされた値を設定すると、ビューが更新されるみたい
                // noinspection RestrictedApi
                bottomNavigationItemView.setChecked(false);

            }

        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

    }
}

手順②

ActivityからBottomNavigationViewHelperを呼びす
onCreateでBottomNavigationViewHelper#disableShiftModeへBottomNavigationViewを渡し調整、その後ついでに選択のリスナーを実装

// ボトムナビゲーションを読み込む
        BottomNavigationView bottomavigation = (BottomNavigationView) findViewById(R.id.bottom_navigation);
        // BottomNavigationViewHelperでアイテムのサイズ、アニメーションを調整
        BottomNavigationViewHelper.disableShiftMode(bottomavigation);
        // BottomNavigationViewを選択したときのリスナー
        bottomavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {

                // 各選択したときの処理
                switch (item.getItemId()) {
                    case R.id.nav_camera:

                        return true;
                    case R.id.nav_gallery:

                        return true;
                    case R.id.nav_slideshow:

                        return true;
                    case R.id.nav_manage:

                        return true;
                }
                return false;
            }
        });

どこをどう変更して追加すると
エラーがなく正常に作動するのか、わかりませんmm

エラーメッセージ

イメージ説明

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2018/05/29 10:00

    エラーが発生しているのですよね?エラーメッセージもご提示ください。 https://teratail.com/help/question-tips#questionTips3-4

    キャンセル

  • syyyow

    2018/05/29 11:35 編集

    追記致しました。よろしくお願いいたします。

    キャンセル

  • dit.

    2018/06/04 15:55

    2018/06/04 15:23のコメントで解決できたとありますが質問が受付中となっています。回答によって解決した場合はその回答をベストアンサーに、自己解決した場合は自分で回答を書いて解決済みにしてください。https://teratail.com/help#resolve-question

    キャンセル

回答 1

checkベストアンサー

0

私はJavaはあまりできませんが。

エラーメッセージ読んでください。

BottomNavigationViewHelper クラスはどこに書いてあるのでしょうか? ( ファイル名がわからん... )

エラーメッセージを読むと、

「BottomNavigationViewHelperはBottomNavigationViewHelper.javaで書け」みたいなやつなので、

もしかして、

ファイル名: Bottom1.java
クラス名: BottomNavigationViewHelper

とかみたいになっていません?

ファイル名は適当ですが。

Javaは

ファイル名 = クラス名

です。

インターフェースだったり、private なクラスとか以外は

クラス名 = ファイル名

のjavaファイルに記載するべきです。

( privateでも一緒に書けますが、classファイルになるときは分割されます。 )

たぶんこれがエラー理由。エラーメッセージを読む限り。

また、エラーメッセージもなるべく画像はやめてください。

引用したりとかするのが大変。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/04 15:23

    ご回答ありがとうございました。
    エラーメッセージの件申し訳ございません。
    解決できました!

    キャンセル

  • 2018/06/07 10:27

    dit.さんが修正依頼の方で「回答によって解決した場合はその回答をベストアンサーに、自己解決した場合は自分で回答を書いて解決済みにしてください」(原文ママ) と述べていらっしゃいますね。
    その通りです。
    質問者さんにとっては解決できた問題でも、もしかしたら別の人が似たような問題に直面して検索した結果、このページを閲覧して...ってこともあります。
    そういう方々のためにも「どのように解決できたか」(勘違い、検索ミスetc.も含む)を記述してください。(「自己解決」の項目に。)

    キャンセル

  • 2018/06/07 13:28

    BeatStarさん
    指摘をしたdit.です。
    すみません、私がコメントをしたタイミングではベストアンサーが決まっておらず、その数分後にみるとこちらの回答がベストアンサーになっておりましたので、ファイル名とクラス名の関係を見直すことで解決したのかな と思っていました。(Javaについての知識はほとんどありません)
    teratailの「質問するときのヒント 4-2」にお礼だけでなくどのように解決したのかを伝えましょう https://teratail.com/help/question-tips#questionTips4-2 とありますので、質問者さんがそれを踏まえたコメントをして下さるのを期待しています。

    キャンセル

  • 2018/06/07 14:12

    ご指摘ありがとうございます。
    訂正し、同じ悩みを持つ方の参考となるよう記述しておきます。
    失礼いたしました><

    キャンセル

関連した質問

同じタグがついた質問を見る

  • Java

    14116questions

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