【问题标题】:Comparing a fragment in a FrameLayout to another fragment将 FrameLayout 中的片段与另一个片段进行比较
【发布时间】:2018-08-26 14:38:28
【问题描述】:

我有一个底部导航的应用程序,它在三个片段之间切换。我在单击菜单项时添加了过渡,我希望能够对它们进行更多自定义,以便当我从左侧项目 (navigation_sync) 转到右侧 (navigation_message) 时> 或 navigation_settings)转换从右到左,反之亦然。我想出了将我的 FrameLayout 的内容与我想通过 switch 更改的片段进行比较,但我不知道如何实际做到这一点。

SelectActivity.java

import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;
import android.widget.FrameLayout;

public class SelectActivity extends AppCompatActivity {

private BottomNavigationView mMainNavigation;
private FrameLayout mMainFrame;
private SyncFragment syncFragment;
private MessageFragment messageFragment;
private SettingsFragment settingsFragment;
int toFragment;

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_select);
    mMainFrame = (FrameLayout) findViewById(R.id.mainFrame);
    mMainNavigation = (BottomNavigationView) findViewById(R.id.navigation);

    syncFragment = new SyncFragment();
    messageFragment = new MessageFragment();
    settingsFragment = new SettingsFragment();

    setFragment(syncFragment);

    mMainNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch(item.getItemId()) {
                case R.id.navigation_sync:
                    setFragment(syncFragment);
                    toFragment = R.id.navigation_sync;
                    return true;
                case R.id.navigation_message:
                    setFragment(messageFragment);
                    toFragment = R.id.navigation_message;
                    return true;
                case R.id.navigation_settings:
                    setFragment(settingsFragment);
                    toFragment = R.id.navigation_settings;
                    return true;
                default:
                    return false;
            }
        }

    });
}
    private void setFragment(Fragment fragment) {
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    switch(R.id.mainFrame) {
        case R.id.navigation_sync:
            fragmentTransaction.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left);
        case R.id.navigation_message:
            if(toFragment == R.id.navigation_sync) {
                fragmentTransaction.setCustomAnimations(R.anim.enter_from_left, R.anim.exit_to_right);
            } else {
                fragmentTransaction.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left);
            }
        case R.id.navigation_settings:
            fragmentTransaction.setCustomAnimations(R.anim.enter_from_left, R.anim.exit_to_right);
    }
    //fragmentTransaction.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left);
    fragmentTransaction.replace (R.id.mainFrame, fragment);
    fragmentTransaction.commit();
}
}

这不会读取任何 fragmentTransaction.setCustomAnimations 所以我认为我在比较错误的值?请帮忙!

【问题讨论】:

    标签: android android-fragments bottomnavigationview


    【解决方案1】:

    我确实想出了解决问题的方法。

    主要助手是Log.d(TAG, "Message");。有了这个,我能够检查navigation_syncsyncFragment 和我的toFragment 变量实际上是什么,然后它就很简单了。我发现syncFragment 和其他对象持有片段的 id,我只需要将它与当前在 FrameLayout 中的片段 id 进行比较。可以用这个方法来完成:

    public Fragment getFragmentId(){
        return getSupportFragmentManager().findFragmentById(R.id.mainFrame);
    }
    

    所以我把它放进了我的开关:

    ...
    switch(getFragmentId()) {
        case syncFragment:
    ...
    

    我收到一条错误消息:

    需要常量表达式

    我发现here 可以通过将switch 转换为if-else 结构来解决,我所做的并且它有效。

    这里有一个完整的代码供任何可能遇到此问题的人使用。请注意,我必须将 toFragment 变量更改为片段变量。此外,我在 onNavigationItemSelected 内的 switch 中设置语句的顺序也很重要。

    import android.support.v4.app.Fragment;
    import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.support.design.widget.BottomNavigationView;
    import android.support.v4.app.FragmentTransaction;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    import android.view.MenuItem;
    import android.widget.FrameLayout;
    
    public class SelectActivity extends AppCompatActivity {
    
    private static final String TAG = "SelectActivity";
    private BottomNavigationView mMainNavigation;
    private FrameLayout mMainFrame;
    private SyncFragment syncFragment;
    private MessageFragment messageFragment;
    private SettingsFragment settingsFragment;
    private Fragment toFragment;
    
    @Override
    public void onBackPressed() {
        moveTaskToBack(true);
    }
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_select);
        mMainFrame = (FrameLayout) findViewById(R.id.mainFrame);
        mMainNavigation = (BottomNavigationView) findViewById(R.id.navigation);
    
        syncFragment = new SyncFragment();
        messageFragment = new MessageFragment();
        settingsFragment = new SettingsFragment();
    
        setFragment(syncFragment);
        toFragment = syncFragment;
    
        mMainNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                switch(item.getItemId()) {
                    case R.id.navigation_sync:
                        toFragment = syncFragment;
                        setFragment(syncFragment);
                        return true;
                    case R.id.navigation_message:
                        setFragment(messageFragment);
                        return true;
                    case R.id.navigation_settings:
                        toFragment = settingsFragment;
                        setFragment(settingsFragment);
                        return true;
                    default:
                        return false;
                }
            }
        });
    }
    private void setFragment(Fragment fragment) {
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        if (getFragmentId() == syncFragment) {
            fragmentTransaction.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left);
        }
        if (getFragmentId()==messageFragment) {
            if(toFragment == syncFragment) {
                fragmentTransaction.setCustomAnimations(R.anim.enter_from_left, R.anim.exit_to_right);
            } else {
                fragmentTransaction.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left);
            }
        }
        if (getFragmentId() == settingsFragment) {
            fragmentTransaction.setCustomAnimations(R.anim.enter_from_left, R.anim.exit_to_right);
        }
        fragmentTransaction.replace (R.id.mainFrame, fragment);
        fragmentTransaction.commit();
    }
    
    public Fragment getFragmentId(){
        return getSupportFragmentManager().findFragmentById(R.id.mainFrame);
    }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-06-30
      • 1970-01-01
      • 2015-12-21
      • 2019-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多