🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

3117閲覧

プログレスバーの表示非表示を切り替えたい

j.f15

総合スコア23

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2021/02/15 09:40

前提・実現したいこと

ログインボタン押下時に
fragmentからactivity_layoutに配置されているプログレスバーの表示非表示を切り替えたい。
表示非表示の切り替えはvisibilityで実装したいです。

発生している問題・エラーメッセージ

id.visibility = View.VISIBLEのような記述をしても変化しない。

該当のソースコード

・LoginActivity

kotlin

1class LoginActivity : AppCompatActivity() { 2 3 override fun onCreate(savedInstanceState: Bundle?) { 4 super.onCreate(savedInstanceState) 5 setContentView(R.layout.activity_login) 6 7 val actionBar: androidx.appcompat.app.ActionBar? = supportActionBar 8 getSupportActionBar()?.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); 9 getSupportActionBar()?.setCustomView(R.layout.login_header); 10 actionBar?.setDisplayHomeAsUpEnabled(true) 11 12 val loginFragment = LoginFragment() 13 val fragmentTransaction = supportFragmentManager.beginTransaction() 14 fragmentTransaction.add(R.id.login_fragment_container, loginFragment) 15 fragmentTransaction.commit() 16 } 17}

・LoginFragment

kotlin

1class LoginFragment : Fragment() { 2 3 private lateinit var login_binding: FragmentLoginBinding 4 private var _binding: ActivityLoginBinding? = null 5 private val activity_binding get() = _binding!! 6 7 private val viewModel: LoginViewModel by lazy { 8 ViewModelProviders.of(this).get(LoginViewModel::class.java) 9 } 10 11 override fun onCreateView( 12 inflater: LayoutInflater, container: ViewGroup?, 13 savedInstanceState: Bundle? 14 ): View? { 15 16 _binding = ActivityLoginBinding.inflate(inflater, container, false) 17 18 login_binding = DataBindingUtil.inflate(inflater, R.layout.fragment_login, container, false) 19 login_binding.lifecycleOwner = viewLifecycleOwner 20 login_binding.viewModel = viewModel 21 22 return login_binding.root 23 } 24 25 override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 26 super.onViewCreated(view, savedInstanceState) 27 28 //パスワードリセット画面遷移ボタン 29 login_binding.pwdForgetBtn.setOnClickListener{ 30 val pwdResetBeforeFragment = PwdResetBeforeFragment() 31 Log.d("!ResetBefore!", "" + pwdResetBeforeFragment) 32 val fragmentTransaction = fragmentManager?.beginTransaction() 33 fragmentTransaction?.addToBackStack(null) 34 fragmentTransaction?.replace(R.id.login_fragment_container, pwdResetBeforeFragment) 35 fragmentTransaction?.commit() 36 } 37 38 //新規登録画面遷移ボタン 39 login_binding.memberRegistrationBtn.setOnClickListener{ 40 val memberRegistrationFragment1 = MemberRegistrationFragment1() 41 val fragmentTransaction = fragmentManager?.beginTransaction() 42 fragmentTransaction?.addToBackStack(null) 43 fragmentTransaction?.replace(R.id.login_fragment_container, memberRegistrationFragment1) 44 fragmentTransaction?.commit() 45 } 46 47 //------ログインボタン押下時にactivity_loginのプログレスバーのvisibilityを切り替えたい------\ 48 //ログイン処理 49 login_binding.loginBtn.setOnClickListener { 50 activity_binding.loginProgressbarLayout.visibility = View.VISIBLE 51 var user_token = viewModel.sendJsonData() 52 Log.d("トークン", ""+user_token) 53 } 54 } 55}

・activity_login

kotlin

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 xmlns:app="http://schemas.android.com/apk/res-auto" 5 xmlns:tools="http://schemas.android.com/tools" 6 android:layout_width="match_parent" 7 android:layout_height="match_parent" 8 tools:context=".login.LoginActivity"> 9 10 <RelativeLayout 11 android:id="@+id/login_fragment_container" 12 android:layout_width="match_parent" 13 android:layout_height="match_parent" 14 app:layout_constraintBottom_toBottomOf="parent" 15 app:layout_constraintEnd_toEndOf="parent" 16 app:layout_constraintStart_toStartOf="parent" 17 app:layout_constraintTop_toTopOf="parent"> 18 19 <RelativeLayout 20 android:id="@+id/login_progressbar_layout" 21 android:layout_width="match_parent" 22 android:layout_height="match_parent" 23 android:translationZ="100dp" 24 android:background="@color/progress_background" 25 android:visibility="invisible" 26 app:layout_constraintBottom_toBottomOf="parent" 27 app:layout_constraintEnd_toEndOf="parent" 28 app:layout_constraintStart_toStartOf="parent" 29 app:layout_constraintTop_toTopOf="parent"> 30 31 <ProgressBar 32 android:id="@+id/progressBar" 33 style="?android:attr/progressBarStyleLarge" 34 android:layout_width="wrap_content" 35 android:layout_height="wrap_content" 36 android:layout_gravity="center_horizontal" 37 android:indeterminate="true" 38 android:indeterminateDrawable="@drawable/progress_bg" 39 android:max="100" 40 app:layout_constraintBottom_toBottomOf="parent" 41 app:layout_constraintEnd_toEndOf="parent" 42 app:layout_constraintStart_toStartOf="parent" 43 app:layout_constraintTop_toTopOf="parent" /> 44 45 </RelativeLayout> 46 47 </RelativeLayout> 48 49</androidx.constraintlayout.widget.ConstraintLayout>

※プログレスバーの背景を薄暗くしたいためvisibilityの機能自体は
プログレスバーの一つ上のRelativeLayoutで行っています。

試したこと

fragment_login_xml(LoginFragmentのlayout)でvisibilityの機能を使ったときは上手く表示非表示が出来たのですが、
新規登録やパスワードリセットの時にもプログレスバーを使う事を考えるとactivity_layoutで表示非表示の機能を作るのが良いと考え実装に取り掛かりました。
そこで下記のような記述をしエラー等は無かったのですが処理が走りませんでした。
(恐らくエラーは無いが取得自体が出来ていない?)

private var _binding: ActivityLoginBinding? = null private val activity_binding get() = _binding!! activity_binding.loginProgressbarLayout.visibility = View.VISIBLE

確認したいファイル等ありましたら教えてください。
お手数をおかけしますがご教示をお願いしたいです。

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

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

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

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

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

hoshi-takanori

2021/02/15 10:39 編集

LoginFragment で ActivityLoginBinding.inflate() してはいけません。 loginProgressbarLayout は LoginActivity に属しているので、loginBtn の OnClickListener では、activity as LoginActivity に対して loginProgressbarLayout の表示・非表示を切り替えるようにお願いする必要があります。 また、画面遷移も LoginActivity でやった方がいいと思います。
j.f15

2021/02/15 10:55

回答ありがとうございます。 なるほど。プログレスバーはactivityにあるのでログインボタンのクリック処理はactivityに対して行わないといけなかったのですね。 そのことを踏まえてもう少し調べて見たいと思います。
guest

回答1

0

自己解決

下にさらに良いと思う実装方法に修正しました。(間違っていたら指摘していただけると助かります)

//ログイン処理 login_binding.loginBtn.setOnClickListener { var loginLayout = (activity as LoginActivity?)!!.layoutInflater.inflate(R.layout.activity_login, login_binding.loginProgressbar) loginLayout.findViewById<RelativeLayout>(R.id.login_progressbar_layout).visibility = View.VISIBLE var user_token = viewModel.sendJsonData() Log.d("トークン", ""+user_token) }

ヒントを頂いたり試行錯誤したりで何とか望んでいた実装は出来たのですが、
inflaterの理解をせずに使っていたり間違った実装をしていたりと酷いプログラムに
なっていると思うので引き続き調べていきたいと思います。

※追記。上記の方法よりも良いと思う実装方法

・LoginActivity

class LoginActivity : AppCompatActivity() { private lateinit var binding : ActivityLoginBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityLoginBinding.inflate(layoutInflater) setContentView(binding.root) val actionBar: androidx.appcompat.app.ActionBar? = supportActionBar getSupportActionBar()?.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); getSupportActionBar()?.setCustomView(R.layout.login_header); actionBar?.setDisplayHomeAsUpEnabled(true) val loginFragment = LoginFragment() val fragmentTransaction = supportFragmentManager.beginTransaction() fragmentTransaction.add(R.id.login_fragment_container, loginFragment) fragmentTransaction.commit() } //プログレスバーの表示 fun progressbarVisible() { binding.loginProgressbarLayout.visibility = View.VISIBLE } //プログレスバーの非表示 fun progressbarInvisible() { binding.loginProgressbarLayout.visibility = View.INVISIBLE } }

・LoginFragment

//ログイン処理 login_binding.loginBtn.setOnClickListener { (activity as LoginActivity?)!!.progressbarVisible() var user_token = viewModel.sendJsonData() Log.d("トークン", ""+user_token) // (activity as LoginActivity?)!!.progressbarInvisible() }

投稿2021/02/15 14:30

編集2021/02/16 03:50
j.f15

総合スコア23

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問