【问题标题】:How to set ArrayAdapter for spinner in Fragment如何在 Fragment 中为微调器设置 ArrayAdapter
【发布时间】:2012-09-05 06:32:24
【问题描述】:

我正在尝试将项目添加到片段中的微调器。但我对上下文有疑问。因为在片段中没有上下文。这是我在做什么

public class DetailFrag extends Fragment {

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

        View scrollView = inflater.inflate(R.layout.myscrollview , container, false);       
        LinearLayout linearLayout = (LinearLayout) scrollView.findViewById(R.id.mylayout1);

        for (int i=0; i<questionList.size(); i++) {

            View verticalLinearLayout = inflater.inflate(R.layout.mylistrow,  null);
            View horizontalLInearLaoyout = verticalLinearLayout.findViewById(R.id.questionRow);
            TextView tv = (TextView) horizontalLInearLaoyout.findViewById(R.id.question);
            Spinner spinner = (Spinner) horizontalLInearLaoyout.findViewById(R.id.spinner);

            //Problem: how to define this in fragment createFromResource(this,...)
            ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
                    this, R.array.options_array, android.R.layout.simple_spinner_item);

            EditText editText = (EditText) verticalLinearLayout.findViewById(R.id.txtMultiLine);

            String question = questionList.get(i).question;

            tv.setId(i);
            tv.setText(i + question);
            spinner.setId(i);
            editText.setId(i);

            linearLayout.addView(verticalLinearLayout);          
        }       
        return scrollView;  
    } //end of onCreateView()
} //end of class DetailFrag

【问题讨论】:

    标签: android android-fragments android-fragmentactivity


    【解决方案1】:

    在片段中,上下文不可用您在代码中所期望的方式。而不是this,请使用以下内容:

    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
        getActivity().getBaseContext(),
        R.array.options_array,
        android.R.layout.simple_spinner_item);
    

    【讨论】:

    • 为什么是.getBaseContext()
    【解决方案2】:

    既然我们在一个片段中,'this' 将无法工作: 使用 getActivity().getBaseContext() 应该用来替换 'this';

        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String> 
       (getActivity().getBaseContext(),
                    android.R.layout.simple_spinner_dropdown_item,
                    listItems);
    

    注意,在旧版本的 Android 中,getContext() 也会返回片段的上下文,但对于新版本,它可能不会返回上下文。因此,使用 getActivity() 你变成了一个 Activity,它是一个上下文。

    我们使用 getActivity() 获取您当前所在的活动,然后使用 getBaseContext(),因为在 Activity 中可以启动多个上下文。我们希望得到 Activity 本身使用的那个。

    【讨论】:

      【解决方案3】:

      做一些类似的事情:

      private Context myContext = null;
      
      public DetailFrag(Context ctx){
          myContext = ctx;
      }
      
      @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
      
      //...
      ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
                      myContext, R.array.options_array, android.R.layout.simple_spinner_item);
      
      
      //  
      }
      

      【讨论】:

      • 我用过这个,它工作了getActivity().getApplicationContext()而不是this
      • @Basit 从不使用应用程序上下文来创建控件!更好地使用活动本身。使用应用程序上下文,您可以快速泄漏上下文。
      猜你喜欢
      • 1970-01-01
      • 2018-09-05
      • 2011-09-12
      • 2012-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-25
      相关资源
      最近更新 更多