【问题标题】:Bundle not working (getArguments() always null) [Android]捆绑包不起作用(getArguments() 始终为空)[Android]
【发布时间】:2015-08-01 17:55:18
【问题描述】:

我的代码几个小时前可以工作,但现在不行了,我看不出是什么原因。

这是我的监听器,点击后我在其中更改片段:

CustomMarkRow.java

public void onClick(DialogInterface dialogInterface, int i){
    Bundle bundle = new Bundle();
    bundle.putInt("id", CustomMarkRow.this.mark.getId());
    FragmentManager fragmentManager = CustomMarkRow.this.fragmentManager;
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();                       activity.getActionBar().setSelectedNavigationItem(CustomMarkRow.this.positionTab);
    EditMarkFragment fragment = new EditMarkFragment();
    fragment.setArguments(bundle);
    fragmentTransaction.replace(R.id.fragmentContainer, fragment,"2");
    fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
}

此时,fragment.getArguments() 包含我放入的内容:

{android.os.Bundle@3644} "Bundle[{id=1}]"

在我的第二个文件中: EditMarkFragment.java

public class EditMarkFragment extends Fragment {
    public View view;

    public EditMarkFragment(){
        super();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {

        this.view = inflater.inflate(getResources().getIdentifier("edit_mark", "layout",container.getContext().getPackageName()), container, false);

        if(this.getArguments()==null){ // always null
            ...
        }

        return this.view
}

getArguments() 在这里总是返回 null,这个示例有什么不好的?

* 编辑 * 这是我的启动器类:

public class Launcher extends Activity implements ActionBar.TabListener {

private HomeFragment frag1 = new HomeFragment();
private EditMarkFragment frag2  = new EditMarkFragment();
private MarkListFragment frag3 = new MarkListFragment();
private EditCategoryFragment frag4 = new EditCategoryFragment();
private CategoryListFragment frag5 = new CategoryListFragment();


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
    setContentView(R.layout.launcher);

    //Configuration de la barre d'onglet

    getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    ActionBar.Tab tab1 = getActionBar().newTab().setTabListener(this).setTag("1").setText("Home"); //.setIcon(R.drawable.homew);
    getActionBar().addTab(tab1);

    ActionBar.Tab tab2 = getActionBar().newTab().setTabListener(this).setTag("2").setText("New Mark"); //.setIcon(R.drawable.addw);
    getActionBar().addTab(tab2);

    ActionBar.Tab tab3 = getActionBar().newTab().setTabListener(this).setTag("3").setText("My Marks"); //.setIcon(R.drawable.listw);
    getActionBar().addTab(tab3);

    ActionBar.Tab tab4 = getActionBar().newTab().setTabListener(this).setTag("4").setText("New Category"); //.setIcon(R.drawable.categoryw);
    getActionBar().addTab(tab4);

    ActionBar.Tab tab5 = getActionBar().newTab().setTabListener(this).setTag("5").setText("Categories"); //.setIcon(R.drawable.categoryw);
    getActionBar().addTab(tab5);

}

@Override
public void onTabSelected(ActionBar.Tab tab, android.app.FragmentTransaction ft) {

    if(tab.getTag().equals("1")){
        ft.replace(R.id.fragmentContainer, frag1);
    }
    else if(tab.getTag().equals("2")){
        ft.replace(R.id.fragmentContainer, frag2);
    }
    else if(tab.getTag().equals("3")){
        ft.replace(R.id.fragmentContainer, frag3);
    }
    else if(tab.getTag().equals("4")){
        ft.replace(R.id.fragmentContainer, frag4);
    }
    else if(tab.getTag().equals("5")){
        ft.replace(R.id.fragmentContainer, frag5);
    }
}

@Override
public void onTabUnselected(ActionBar.Tab tab, android.app.FragmentTransaction ft) {

    if(tab.getTag().equals("1")){
        ft.remove(frag1);
    }
    else if(tab.getTag().equals("2")){
        ft.remove(frag2);
    }
    else if(tab.getTag().equals("3")){
        ft.remove(frag3);
    } else if(tab.getTag().equals("4")){
        ft.remove(frag4);
    }
 else if(tab.getTag().equals("5")){
    ft.remove(frag5);
}
}

@Override
public void onTabReselected(ActionBar.Tab tab, android.app.FragmentTransaction ft) {

}
}

【问题讨论】:

  • 这是整个源代码吗?似乎没有任何问题,我想知道您是否将 null 存储在其他地方的参数中?
  • 与您的问题无关,但请从您的view 数据成员中删除static。不要将小部件放在静态数据成员中,否则会导致内存泄漏。
  • @CommonsWare 谢谢你的建议!
  • @harism onCreateView 的第一行和我的“如果”之间没有任何内容,如果它是你的意思的话。当我调试时,在每一行中,getArguments() 值为“null”。
  • 您确定您没有在其他任何地方创建EditMarkFragment,并且您遇到了null Bundle?

标签: android arguments bundle


【解决方案1】:

虽然您的 onClick() 代码正在创建参数 Bundle,但您的 onCreate() 不是。如果那个版本的片段调用getArguments(),该方法将返回null。

【讨论】:

  • 抱歉,我不太理解您的评论,我的启动器文件只允许我管理操作栏选项卡(实际上每个选项卡都包含一个片段)。在其中一个片段中,我有这个 OnClick() 方法创建一个参数,我想在另一个名为 EditMarkFragment 的片段(因此在另一个选项卡中)中获取该参数。我该怎么做才能得到这个论点?我不明白为什么它在几个小时前就起作用了,而不再起作用了,也看不出是什么原因造成的。你能解释一下我该如何解决吗?
  • “我不太理解你的评论,抱歉”——在你的编辑中,在代码中,你有private EditMarkFragment frag2 = new EditMarkFragment();。您没有在问题中的任何代码中调用EditMarkFragment 的this instance 上的setArguments()。当EditMarkFragment 的此实例 尝试调用getArguments() 时,它将得到null 作为响应。因此,EditMarkFragment 的 此实例 将在 onCreateView() 中崩溃。要么去掉EditMarkFragment的这个实例,要么给它一个Bundle,或者让onCreateView()处理一个null参数Bundle。
  • 我现在明白了,你完全正确!非常感谢@CommonsWare,我现在会修复它。
  • @Redouane B. 你是怎么解决的?
【解决方案2】:

1-更新您的 EditMark 片段,如下所示:-

public class EditMarkFragment extends Fragment { 
public static View view;

 public static EditMarkFragment newInstance(int id) {
    EditMarkFragment fragment = new EditMarkFragment();
    Bundle bundle = new Bundle();
    bundle.putInt("id", id);
    fragment.setArguments(bundle);
    return fragment;
}

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {

    this.view = inflater.inflate(getResources().getIdentifier("edit_mark", "layout",container.getContext().getPackageName()), container, false);

  int id=getArguments.getInt("id");

    return this.view} 

2- 在 CustomMarkRow 中将您的代码更新为:-

 public void onClick(DialogInterface dialogInterface, int i){
    FragmentManager fragmentManager = CustomMarkRow.this.fragmentManager;
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();                       activity.getActionBar().setSelectedNavigationItem(CustomMarkRow.this.positionTab);
    EditMarkFragment fragment =  EditMarkFragment.newInstance(CustomMarkRow.this.mark.getId()) ;
    fragmentTransaction.replace(R.id.fragmentContainer, fragment,"2");
    fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
}

试试这个,希望对你有帮助。

【讨论】:

  • 它不起作用 @AdarshYadav , getArguments() 也为空:/ 但感谢您的尝试。
  • 您确定您是从 CustomMarkRow.this.mark.getId() 获取 id 吗?如果没有,请调试和测试。
  • 是的,如果我打印 fragment.getArguments() 我有:{android.os.Bundle@3644} "Bundle[{id=1}]"
  • 根据您的代码,一切看起来都不错,如果它不起作用,那么为什么不使用接口或square.github.io/otto 进行片段之间的通信。
猜你喜欢
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-15
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多