将 FrameLayout 中的片段与另一个片段进行比较
Comparing a fragment in a FrameLayout to another fragment
我有一个带有底部导航的应用程序,它在三个片段之间切换。我在单击菜单项时添加了转换,我希望能够更多地自定义它们,以便当我从左侧项目 (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 所以我想我比较的是错误的值?请帮忙!
我确实想出了解决问题的办法。
主要帮手是Log.d(TAG, "Message");
。有了这个,我能够检查 navigation_sync
、syncFragment
和我的 toFragment
变量实际持有什么,然后就很简单了。我发现 syncFragment
和其他对象保存片段的 ID,我只需要将其与当前在 FrameLayout 中的片段 ID 进行比较。这可以用这个方法来完成:
public Fragment getFragmentId(){
return getSupportFragmentManager().findFragmentById(R.id.mainFrame);
}
所以我将其放入我的开关中:
...
switch(getFragmentId()) {
case syncFragment:
...
我收到一条错误消息:
Constant expression required
我发现 here 可以通过将 switch
转换为 if
-else
结构来解决,我这样做了并且有效。
这是一个完整的代码,供任何可能 运行 参与其中的人使用。请注意,我必须将 toFragment
变量更改为 Fragment 变量。此外,我在 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);
}
}
我有一个带有底部导航的应用程序,它在三个片段之间切换。我在单击菜单项时添加了转换,我希望能够更多地自定义它们,以便当我从左侧项目 (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 所以我想我比较的是错误的值?请帮忙!
我确实想出了解决问题的办法。
主要帮手是Log.d(TAG, "Message");
。有了这个,我能够检查 navigation_sync
、syncFragment
和我的 toFragment
变量实际持有什么,然后就很简单了。我发现 syncFragment
和其他对象保存片段的 ID,我只需要将其与当前在 FrameLayout 中的片段 ID 进行比较。这可以用这个方法来完成:
public Fragment getFragmentId(){
return getSupportFragmentManager().findFragmentById(R.id.mainFrame);
}
所以我将其放入我的开关中:
...
switch(getFragmentId()) {
case syncFragment:
...
我收到一条错误消息:
Constant expression required
我发现 here 可以通过将 switch
转换为 if
-else
结构来解决,我这样做了并且有效。
这是一个完整的代码,供任何可能 运行 参与其中的人使用。请注意,我必须将 toFragment
变量更改为 Fragment 变量。此外,我在 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);
}
}