Android获取片段ID以在Switch语句

时间:2015-05-26 16:19:21

标签: android android-fragments switch-statement

所以,我正在编写应用程序的导航部分,并在活动中动态创建了片段。

我希望,当用户点击下一个或上一个箭头时,应用程序会找出活动中的片段,并将其替换为下一个或上一个片段。为了做到这一点,我创建了一个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;
        }
    }
}

2 个答案:

答案 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;
    }
}

修改

来自documentation

  

使用findFragmentById()获取活动中存在的片段(for   在活动布局中提供UI的片段)或   findFragmentByTag()(用于提供或不提供UI的片段)。

通常我们将id用于静态片段(嵌入在活动布局中,并且您不需要在运行时更改)。对于动态片段而言,最好使用标签。

祝你好运