Android 获取用于 Switch 语句的片段 ID

Android Getting Fragment ID for use in Switch statement

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

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

这看起来很复杂,我会建议一些更简单的。

使用Fragment.instantiate创建一个片段并替换当前片段。如果您的片段的顺序是固定的,请保留一个数组,其中包含每个片段的 class 的名称(以良好的顺序)。

然后,保留一个指针以了解您在数组中的位置,并且每次转到 next/previous 片段时,相应地增加您的指针。

这样,您就不必逐个处理,这似乎很容易出错。您应该考虑以下情况

pointer == 0 and pointer == length-1.

这样,您可以一个接一个地拥有任意数量的片段。但是请注意,它仅适用于确定的订单。如果你想要更复杂的东西,你应该扩展 Fragment class 并将逻辑添加到你的 subclass.

尝试这样做:

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

Get fragments that exist in the activity, with findFragmentById() (for fragments that provide a UI in the activity layout) or findFragmentByTag() (for fragments that do or don't provide a UI).

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

祝你好运