2017-06-20 13 views
2

これは私の問題です。下のバーで別のボタンをクリックしたときにレイアウトを変更する必要があります。
各ボタンをクリックすると、別のウィジェットを表示したいと思います。 マイactivity_main.xmlはこれです:BottomNavigationViewでFrameLayoutを動的に変更

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout 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" 
    android:orientation="vertical" 
    tools:context="com.codanimex.android.prova.MainActivity"> 

    <FrameLayout 
     android:id="@+id/content" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1"> 

     <TextView 
      android:id="@+id/message" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginBottom="@dimen/activity_vertical_margin" 
      android:layout_marginLeft="@dimen/activity_horizontal_margin" 
      android:layout_marginRight="@dimen/activity_horizontal_margin" 
      android:layout_marginTop="@dimen/activity_vertical_margin" 
      android:text="@string/title_home" /> 

    </FrameLayout> 

    <android.support.design.widget.BottomNavigationView 
     android:id="@+id/navigation" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom" 
     android:background="?android:attr/windowBackground" 
     app:menu="@menu/navigation" /> 

</LinearLayout> 

私MainActivity.javaは次のとおりです。

package com.codanimex.android.prova; 

import android.os.Bundle; 
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_home: 
        mTextMessage.setText(R.string.title_home); 
        return true; 
       case R.id.navigation_dashboard: 
        mTextMessage.setText(R.string.title_dashboard); 
        return true; 
       case R.id.navigation_notifications: 
        mTextMessage.setText(R.string.title_notifications); 
        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); 
    } 

} 

私はフラグメントを使用する必要がある場合、あなたはそれを説明することができますか?私は彼らの機能を理解できませんでした。
ありがとうございました。

答えて

1

最初に、ボタンごとに独自のレイアウトを持つフラグメントを作成します。 例:HomeFragment,DashboardFragmentNotificationFragmentです。

次に、FrameLayoutの中からTextViewを削除します。これは不要です。フラグメント自体を表示するためです。 activity_main.xmlは次のようになります。そして、

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 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" 
    android:orientation="vertical" 
    tools:context="com.codanimex.android.prova.MainActivity"> 

    <FrameLayout 
     android:id="@+id/content" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1"> 
    </FrameLayout> 

    <android.support.design.widget.BottomNavigationView 
     android:id="@+id/navigation" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom" 
     android:background="?android:attr/windowBackground" 
     app:menu="@menu/navigation" /> 

</LinearLayout> 

断片を切り替えることがMainActivity.javaでコードを更新します。

public class MainActivity extends AppCompatActivity { 

    private enum NavigationFragment{ 
     Home, 
     Dashboard, 
     Notification 
    } 

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

     @Override 
     public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
      switch (item.getItemId()) { 
       case R.id.navigation_home: 
        ChangeFragment(NavigationFragment.Home); 
        return true; 
       case R.id.navigation_dashboard: 
        ChangeFragment(NavigationFragment.Dashboard); 
        return true; 
       case R.id.navigation_notifications: 
        ChangeFragment(NavigationFragment.Notification); 
        return true; 
      } 
      return false; 
     } 

    }; 

    private void ChangeFragment(NavigationFragment value){ 
     Fragment fragment = null; 
     switch (value) { 
      case Home: fragment = new HomeFragment(); break; 
      case Dashboard: fragment = new DashboardFragment(); break; 
      case Notification: fragment= new NotificationFragment();break; 
     } 
     if(fragment!=null) 
      getSupportFragmentManager() 
        .beginTransaction() 
        .replace(R.id.content, fragment) 
        .commit(); 

    } 


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

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

} 
+0

あなただけではないん別の静的コンテンツと静的コンテンツを交換しようとしている場合何らかのアクションがある場合は、フラグメントのコンセプトを通常のviewの置き換えで置き換えることを検討するべきです。 'frameLayout.removeAllViews(); frameLayout.addView(view); ' – omarmallat

関連する問題