所以,我正在编写应用程序的导航部分,并在活动中动态创建了片段。
我希望,当用户点击下一个或上一个箭头时,应用程序会找出活动中的片段,并将其替换为下一个或上一个片段。为了做到这一点,我创建了一个switch语句来检查正在显示的片段。
我认为我可以使用
来做到这一点getSupportFragmentManager().findFragmentById(R.id.activity_public_internet)
但这似乎不适用于switch语句。
所以我尝试了
getFragmentManager().findFragmentById(R.id.public_internet_intro_fragment).getId()
这也不起作用。
这是完整的代码。任何帮助将完全赞赏。并随时告诉我是否有更好的方法。
public void goPrev(View view) {
switch(getSupportFragmentManager().findFragmentById(R.id.activity_public_internet).getId()) {
case R.id.public_internet_intro_fragment:
Intent intent = new Intent(this, LearnActivity.class);
startActivity(intent);
break;
case R.id.public_internet_topic_fragment:
Fragment introFragment = new PublicInternetIntroFragment();
FragmentTransaction exampleTransaction = getFragmentManager().beginTransaction();
exampleTransaction.replace(R.id.activity_public_internet, introFragment);
exampleTransaction.addToBackStack(null);
exampleTransaction.commit();
break;
case R.id.public_internet_example_fragment:
Fragment topicFragment = new PublicInternetTopicFragment();
FragmentTransaction topicTransaction = getFragmentManager().beginTransaction();
topicTransaction.replace(R.id.activity_public_internet, topicFragment);
topicTransaction.addToBackStack(null);
topicTransaction.commit();
break;
}
}
public void goNext(View view) {
switch(getFragmentManager().findFragmentById(R.id.public_internet_intro_fragment).getId()) {
case R.id.public_internet_intro_fragment:
Fragment topicFragment = new PublicInternetTopicFragment();
FragmentTransaction topicTransaction = getFragmentManager().beginTransaction();
topicTransaction.replace(R.id.activity_public_internet, topicFragment);
topicTransaction.addToBackStack(null);
topicTransaction.commit();
break;
case R.id.public_internet_topic_fragment:
Fragment exampleFragment = new PublicInternetExampleFragment();
FragmentTransaction exampleTransaction = getFragmentManager().beginTransaction();
exampleTransaction.replace(R.id.activity_public_internet, exampleFragment);
exampleTransaction.addToBackStack(null);
exampleTransaction.commit();
break;
case R.id.public_internet_example_fragment:
Intent intent = new Intent(this, LearnActivity.class);
startActivity(intent);
break;
}
}
检查错误日志时,尝试调用int android.app.Fragment.getId()
后会引发空指针异常
编辑:添加了PublicInternetActivity.java
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.NavUtils;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
public class PublicInternetActivity extends ActionBarActivity{
private static final String tag_public_internet_intro_fragment = "public_internet_intro_fragment";
private static final String tag_public_internet_topic_fragment = "public_internet_topic_fragment";
private static final String tag_public_internet_example_fragment = "public_internet_example_fragment";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_public_internet);
introFrag();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu items for use in the action bar
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_learn, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_home) {
goHome();
return true;
}
else {
return super.onOptionsItemSelected(item);
}
}
public void introFrag() {
Fragment introFragment = new PublicInternetIntroFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.activity_public_internet, introFragment);
transaction.addToBackStack(null);
transaction.commit();
}
public void goHome() {
Intent homeIntent = NavUtils.getParentActivityIntent(this);
NavUtils.navigateUpTo(this, homeIntent);
}
public void pushNewFragment( Fragment newFrag, String tag) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.activity_public_internet, newFrag, tag);
transaction.addToBackStack(tag);
transaction.commit();
}
public String getActiveFragmentTag() {
if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
return null;
}
String tag = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName();
return tag;
}
public void goPrev(View view) {
switch(getActiveFragmentTag()) {
case tag_public_internet_intro_fragment:
Intent intent = new Intent(this, LearnActivity.class);
startActivity(intent);
break;
case tag_public_internet_topic_fragment:
Fragment introFragment = new PublicInternetIntroFragment();
pushNewFragment(introFragment, tag_public_internet_intro_fragment);
break;
case tag_public_internet_example_fragment:
Fragment topicFragment = new PublicInternetTopicFragment();
pushNewFragment(topicFragment, tag_public_internet_topic_fragment);
break;
}
}
public void goNext(View view) {
switch(getActiveFragmentTag()) {
case tag_public_internet_intro_fragment:
Fragment topicFragment = new PublicInternetTopicFragment();
pushNewFragment(topicFragment, tag_public_internet_topic_fragment);
break;
case tag_public_internet_topic_fragment:
Fragment exampleFragment = new PublicInternetExampleFragment();
pushNewFragment(exampleFragment, tag_public_internet_example_fragment);
break;
case tag_public_internet_example_fragment:
Intent intent = new Intent(this, LearnActivity.class);
startActivity(intent);
break;
}
}
}
答案 0 :(得分:0)
这看起来很复杂,我建议更简单一些。
使用Fragment.instantiate创建片段并替换当前片段。如果你的片段的顺序是固定的,请保留一个数组,其中包含每个片段的类名(按照正确的顺序)。
然后,保持一个指针,知道你在Array中的位置,每次进入下一个/上一个Fragment时,相应地增加指针。
这样,您不必逐案处理,这似乎非常容易出错。您应该考虑
的情况pointer == 0 and pointer == length-1.
这样,你可以一个接一个地拥有任意数量的碎片。但请注意,它仅适用于确定的订单。如果你想要更复杂的东西,你应该扩展Fragment类并在你的子类中添加逻辑。
答案 1 :(得分:0)
尝试这样做:
public void pushNewFragment( Fragment newFrag, String tag) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.activity_public_internet, newFrag, tag);
transaction.addToBackStack(tag);
transaction.commit();
}
public String getActiveFragmentTag() {
if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
return null;
}
String tag = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName();
return tag;
}
public void goPrev(View view) {
switch(getActiveFragmentTag()) {
case tag_public_internet_intro_fragment:
Intent intent = new Intent(this, LearnActivity.class);
startActivity(intent);
break;
case tag_public_internet_topic_fragment:
Fragment introFragment = new PublicInternetIntroFragment();
pushNewFragment(introFragment, tag_public_internet_intro_fragment);
break;
case tag_public_internet_example_fragment:
Fragment topicFragment = new PublicInternetTopicFragment();
pushNewFragment(introFragment, tag_public_internet_topic_fragment);
break;
}
}
修改强>
使用findFragmentById()获取活动中存在的片段(for 在活动布局中提供UI的片段)或 findFragmentByTag()(用于提供或不提供UI的片段)。
通常我们将id用于静态片段(嵌入在活动布局中,并且您不需要在运行时更改)。对于动态片段而言,最好使用标签。
祝你好运