アクティビティの開始時にスナックバーを表示する方法は?


98

Snackbar (android.support.design.widget.Snackbar)ように、アクティビティの開始時にAndroid を表示しToastます。

しかし問題は、次のSnackbarように作成するときに親レイアウトを指定する必要があることです。

Snackbar.make(parentlayout, "This is main activity", Snackbar.LENGTH_LONG)
            .setAction("CLOSE", new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                }
            })
            .setActionTextColor(getResources().getColor(android.R.color.holo_red_light ))
            .show();

Snackbarアクティビティの開始時にクリックイベントなしで表示するときに親レイアウトを指定する方法(クリックイベントの場合、親ビューを簡単に渡すことができます)?


1
onetouchcode.com/2016/12/24/use-snackbar-android-appsに記事を書いた。これはSnackbarの詳細を知るのに役立つ
Shailendra

回答:


211

XML View内をポイントするだけActivity'sです。たとえば、ルートのviewGroupにIDを指定して、次のように使用できます。

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);    
   setContentView(R.layout.main_activity);
   View parentLayout = findViewById(android.R.id.content);
   Snackbar.make(parentLayout, "This is main activity", Snackbar.LENGTH_LONG) 
        .setAction("CLOSE", new View.OnClickListener() {
            @Override 
            public void onClick(View view) {

            } 
        }) 
        .setActionTextColor(getResources().getColor(android.R.color.holo_red_light ))
        .show(); 
   //Other stuff in OnCreate();
}

57
ルートビューの場合は、findViewById(android.R.id.content)ここに示すように一般的に使用することもできます。stackoverflow.com
John Cummings

parentLayout = findViewById(R.id.root_view);を表示します。5.0以前のバージョンでnullpointer例外をスローします。この問題を解決するには?
Anand Savjani

1
@AnandSavjani 5.0および5.0未満では、コードは完全に動作します。レイアウト(root_view)にエラーがあるはずです。フラグメントを使用している場合は、rootview.findViewById(R.id.your_parent_view);と記述してください。また、レイアウト名と同じIDを指定しないでください。
Sudheesh Mohan

ルートとしてCoordinatorLayoutを使用していない場合は、NullpointerExceptionがスローされると思います。
Ishaan

サポートデザインライブラリを含めることを忘れないでください: 'com.android.support:design:27.0.0'
Nikola

26

これまで、Snackbarの表示に問題がありました。これがスナックバーを表示する最も簡単な方法です。メインアクティビティの開始として表示するには、次の2行をOnCreate()

    Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content), "Welcome To Main Activity", Snackbar.LENGTH_LONG);
    snackbar.show();

PSちょうどAndroidデザインサポートをインポートしたことを確認してください(質問で述べたように)。

Kotlinの場合、

Snackbar.make(findViewById(android.R.id.content), message, Snackbar.LENGTH_SHORT).show()

8

これを試して

Snackbar.make(findViewById(android.R.id.content), "Got the Result", Snackbar.LENGTH_LONG)
                        .setAction("Submit", mOnClickListener)
                        .setActionTextColor(Color.RED)
                        .show();

3

onCreateでこのメソッドを呼び出す

Snackbar snack = Snackbar.make(
                    (((Activity) context).findViewById(android.R.id.content)),
                    message + "", Snackbar.LENGTH_SHORT);
snack.setDuration(Snackbar.LENGTH_INDEFINITE);//change Duration as you need
            //snack.setAction(actionButton, new View.OnClickListener());//add your own listener
            View view = snack.getView();
            TextView tv = (TextView) view
                    .findViewById(android.support.design.R.id.snackbar_text);
            tv.setTextColor(Color.WHITE);//change textColor

            TextView tvAction = (TextView) view
                    .findViewById(android.support.design.R.id.snackbar_action);
            tvAction.setTextSize(16);
            tvAction.setTextColor(Color.WHITE);

            snack.show();

2

ショースナックバーのutils関数

fun showSnackBar(activity: Activity, message: String, action: String? = null,
    actionListener: View.OnClickListener? = null, duration: Int = Snackbar.LENGTH_SHORT) {
    val snackBar = Snackbar.make(activity.findViewById(android.R.id.content), message, duration)
        .setBackgroundColor(Color.parseColor("#CC000000")) // todo update your color
        .setTextColor(Color.WHITE)
    if (action != null && actionListener!=null) {
        snackBar.setAction(action, actionListener)
    }
    snackBar.show()
}

アクティビティでの使用例

  showSnackBar(this, "No internet")
  showSnackBar(this, "No internet", duration = Snackbar.LENGTH_LONG)
  showSnackBar(activity, "No internet", "OK", View.OnClickListener { 
       // handle click 
  })

フラグメントでの使用例

  showSnackBar(getActivity(), "No internet")

それが役に立てば幸い


1

このライブラリを試すことができます。これは、Androidのデフォルトのスナックバーのラッパーです。https://github.com/ChathuraHettiarachchi/CSnackBar

Snackbar.with(this,null)
    .type(Type.SUCCESS)
    .message("Profile updated successfully!")
    .duration(Duration.SHORT)
    .show();

これには、複数のタイプのスナックバー、さらにはカスタムビュー統合スナックバーが含まれています


1

これは、onCreate内で次のコードを使用するだけで実行できます。Androidのデフォルトレイアウトを使用する

Snackbar.make(findViewById(android.R.id.content),"Your Message",Snackbar.LENGTH_LONG).show();

Androidバージョン5.xの場合-突然getWindow().getDecorView()すべての画面に戻り、「下ボタン」(ホーム、バックなど)を含めます。したがって、私のスナックはアプリではなく、このボタンまで表示されていました
alena_fox_spb

更新された回答を確認してください。それはあなたの問題を解決します。Androidのデフォルトのレイアウトを使用
Jarin Rocks

はい、私はから変更されたときwindowandroid.R.id.content、すべてのスタートの仕事。だから私は将来的に他の誰かの問題を解決するために私のコメントを書きました)
alena_fox_spb

0

すべてのアクティビティのスーパークラスを定義し、親アクティビティで一度ビューを見つけることもできます。

例えば

AppActivity.java:

public class AppActivity extends AppCompatActivity {

    protected View content;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        changeLanguage("fa");
        content = findViewById(android.R.id.content);
    }
}

そしてあなたのスナックはあなたのアプリのすべての活動でこのようになります:

Snackbar.make(content, "hello every body", Snackbar.LENGTH_SHORT).show();

パフォーマンスについては、アクティビティごとに1回ビューを見つける必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.