【问题标题】:Fragment returning null from intent从意图返回 null 的片段
【发布时间】:2015-07-02 20:02:46
【问题描述】:

所以我做了一堆 4 个按钮,为每个按钮设置一个意图。他们都导航到同一个 Fragment 类。但是它们的附加功能是不同的,所以如果 button1 被单击,Fragment 将打开并执行某个操作,如果 button2 被单击,Fragment 将执行另一个操作,依此类推。我尝试了正常活动的代码并且它工作,但在片段中它不工作。它只是返回我“Id 为空”

发送意图的类

public class Intennt extends ActionBarActivity {

Button bt1,bt2,bt3,bt4;
Context context = this;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_intennt);
    bt1 = (Button) findViewById(R.id.button);
    bt2 = (Button) findViewById(R.id.button2);
    bt3 = (Button) findViewById(R.id.button3);
    bt4 = (Button) findViewById(R.id.button4);


    bt1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(context, ItemListActivity.class);

i.putExtra(ItemDetailFragment.ID_ACTION,ItemDetailFragment.ACTION_1);
            startActivity(i);
        }
    });

    bt2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(context, ItemListActivity.class);  
            i.putExtra(ItemDetailFragment.ID_ACTION, 
  ItemDetailFragment.ACTION_2);
            startActivity(i);
        }
    });
}

接收意图和额外内容的片段

public class ItemDetailFragment extends Fragment {
public static final int ACTION_1 = 1;
public static final int ACTION_2 = 2;
public static final int ACTION_3 = 3;
public static final int ACTION_4 = 4;
public static final int ACTION_NULL = -1;
public static final String ID_ACTION = "action_id";


public static final String ARG_ITEM_ID = "item_id";


private DummyContent.DummyItem mItem;

public ItemDetailFragment() {
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    if (getArguments().containsKey(ARG_ITEM_ID)) {
        // Load the dummy content specified by the fragment
        // arguments. In a real-world scenario, use a Loader
        // to load content from a content provider.
        mItem = 
DummyContent.ITEM_MAP.get(getArguments().getString(ARG_ITEM_ID));
    }


    int id = getActivity().getIntent().getIntExtra(ID_ACTION, -1);

    if (id == ACTION_NULL) {
        Log.d("TAG", "id is null");
        Toast.makeText(getActivity(), "id is null!", 
Toast.LENGTH_SHORT).show();
    } else if (id == ACTION_1) {
        Log.i("TAG", "ALLOHA! from button 1");
        Toast.makeText(getActivity(), "Aloha from button 1!", 
Toast.LENGTH_LONG).show();
    } else if (id == ACTION_2) {
        Log.i("TAG", "Hello from button 2");
        Toast.makeText(getActivity(),"Hello from button 2!", 
Toast.LENGTH_LONG).show();
    }
    else if (id == ACTION_3) {
        Log.i("TAG", "Hello from button 3");
        Toast.makeText(getActivity(),"Hello from button 2!", 
Toast.LENGTH_LONG).show();
    }
    else if (id == ACTION_4) {
        Log.i("TAG", "Hello from button 4");
        Toast.makeText(getActivity(),"Hello from button 2!", 
Toast.LENGTH_LONG).show();
    }


}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_item_detail, 
container, false);



    return rootView;
}
}

【问题讨论】:

标签: java android android-fragments android-intent extras


【解决方案1】:

要导航到片段,您需要实例化片段类,然后使用 FragmentManager 进行事务:

FragmentClass fragment = new FragmentClass();

getFragmentManager()    
    .beginTransaction()
    .replace(R.id.your_fragment_view, fragment)
    .commit();

您可以继续执行当前活动中的每个操作(因为它仍然是主要活动)。

【讨论】:

    【解决方案2】:
    public class Questions extends DialogFragment {
    
    private static Button Submit;
    public int count = 0;
    
    public interface DialogListener {
        void onQuestionsFinish(ArrayList<xmlQuestion> l);
    }
    
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_questions, container, false);
        getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
        //getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    
    
    
        Submit = (Button) rootView.findViewById(R.id.SubmitButton);
    
    
        Submit.setOnClickListener(new View.OnClickListener(){
            public void onClick(View arg0){
                for(int i = 0; i<questionList.size(); i++)
                {
                    questionList.get(i).setAnswer();
                }
                DialogListener activity = (DialogListener) getActivity();
                activity.onQuestionsFinish(questionList);
                Questions.this.dismiss();
            }
        });
    
        DisplayMetrics metrics = new DisplayMetrics();
        getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
        yInch = metrics.ydpi;
        pixHeight = metrics.heightPixels;
    
        Display display = getActivity().getWindowManager().getDefaultDisplay();
        Point size = new Point(); display.getSize(size);
        screenWidth=size.x; screenHeight=size.y;
    
        LinearLayout.LayoutParams bodyParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,screenHeight*900/1024);
        BodyLayout.setLayoutParams(bodyParams);
    
        WindowManager.LayoutParams wmlp = getDialog().getWindow().getAttributes();
        wmlp.height=screenHeight; wmlp.width=screenWidth;
    
        getDialog().getWindow().setAttributes(wmlp);
        WindowManager.LayoutParams lp = getDialog().getWindow().getAttributes();
        lp.dimAmount=0.4f;
        getDialog().getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
        getDialog().setCanceledOnTouchOutside(true);
    
    
        return rootView;
    }
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(DialogFragment.STYLE_NO_FRAME, android.support.v7.appcompat.R.style.Theme_AppCompat_Light);
    
    }
    
    
    public Questions()
    {
    
    }
    
    }
    

    您不必使用意图来启动片段。使用片段的主要好处是能够更轻松地引用每个片段中的数据。您可以简单地创建片段类的新实例,并为其分配公共变量。然后就这样开始吧……

    Questions q = new Questions();
    q.count = 0;
    q.show(getSupportFragmentManager(), "Dialog Fragment");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多