【问题标题】:Wrong 1st Argument Type Error on "this" in Fragment Array片段数组中“this”的第一个参数类型错误
【发布时间】:2017-06-22 06:04:27
【问题描述】:

当我意识到必须使用片段而不是活动来在所有活动中拥有相同的导航菜单时,我几乎完成了我的应用程序,并且正在做导航菜单。所以现在,我目前正在复制、粘贴和使活动 java 在片段 java 中工作。在我的设置页面上,我有一个微调器,可让您选择一种语言。但是,部分代码中有一个我似乎无法弄清楚的错误。非常感谢所有帮助!谢谢!

package com.ezeapplications.quikflipfinal;


import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.Toast;

import java.util.Locale;
import java.util.Set;


/**
 * A simple {@link Fragment} subclass.
 */
public class SettingsFragment extends Fragment implements View.OnClickListener, AdapterView.OnItemSelectedListener {

    public SettingsFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_settings, container, false);
        Button settupdatebtn = (Button) view.findViewById(R.id.setting_update_btn);
        settupdatebtn.setOnClickListener(this);

        Spinner langspinner = (Spinner) view.findViewById(R.id.settings_language_spinner);
        // Create an ArrayAdapter using the string array and a default spinner layout
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(),
                R.array.lang_array, android.R.layout.simple_spinner_item);
        // Specify the layout to use when the list of choices appears
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        // Apply the adapter to the spinner
        langspinner.setAdapter(adapter);
        return view;
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {

        Spinner langspinner = (Spinner) view.findViewById(R.id.settings_language_spinner);
        langspinner.setOnItemSelectedListener(this);

        if (pos == 1) {

            Toast.makeText(parent.getContext(),
                    "You Have Selected English!", Toast.LENGTH_SHORT)
                    .show();
            setLocale("en");
            SettingsFragment fragmenten = new SettingsFragment();
            android.support.v4.app.FragmentTransaction fragmentTransactionen =
                    getActivity().getSupportFragmentManager().beginTransaction();
            fragmentTransactionen.replace(R.id.fragment_container, fragmenten);
            fragmentTransactionen.commit();
            langspinner.setSelection(1);

        } else if (pos == 2) {

            Toast.makeText(parent.getContext(),
                    "Has Seleccionado Español!", Toast.LENGTH_SHORT)
                    .show();
            setLocale("es");
            SettingsFragment fragmentes = new SettingsFragment();
            android.support.v4.app.FragmentTransaction fragmentTransactiones =
                    getActivity().getSupportFragmentManager().beginTransaction();
            fragmentTransactiones.replace(R.id.fragment_container, fragmentes);
            fragmentTransactiones.commit();
            langspinner.setSelection(2);

        } else if (pos == 3) {

            Toast.makeText(parent.getContext(),
                    "Vous Avez Sélectionné Le Français!", Toast.LENGTH_SHORT)
                    .show();
            setLocale("fr");
            SettingsFragment fragmentfr = new SettingsFragment();
            android.support.v4.app.FragmentTransaction fragmentTransactionfr =
                    getActivity().getSupportFragmentManager().beginTransaction();
            fragmentTransactionfr.replace(R.id.fragment_container, fragmentfr);
            fragmentTransactionfr.commit();
            langspinner.setSelection(3);
        }
    }

    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO Auto-generated method stub
    }


        @Override
                public void onClick (View v) {
            SettingsFragment fragment = new SettingsFragment();
            android.support.v4.app.FragmentTransaction fragmentTransaction =
                    getFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.fragment_container,fragment);
            fragmentTransaction.commit();
            Toast.makeText(getActivity(), "Settings Updated!", Toast.LENGTH_SHORT).show();
        };

public void setLocale(String lang) {

        Locale myLocale = new Locale(lang);
        Resources res = getResources();
        DisplayMetrics dm = res.getDisplayMetrics();
        Configuration conf = res.getConfiguration();
        conf.locale = myLocale;
        res.updateConfiguration(conf, dm);
        }

    }

【问题讨论】:

  • 你能把错误贴在这里吗?没有它,没有人可以识别您的问题。
  • 我不小心发布了问题,而不是添加标签或代码。我正计划这样做,但不得不编辑问题,因为我不小心发布得太早了。代码就在那里!

标签: java android android-studio android-fragments android-spinner


【解决方案1】:

您需要一个上下文来从资源中创建 ArrayAdapter。 Fragment 类没有自己的上下文,而是取决于托管它的 Activity。所以你需要从你的 Fragment 所在的 Activity 中传递上下文。

这应该让你排序,

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

希望这会有所帮助,Happin coding!

【讨论】:

  • 谢谢!我得到了错误消失,但它不会改变语言。我制作了西班牙语 (ES) 和法语 (FR) 的 strings.xml 文件,所以这应该不是问题。当我更改微调器选择时,我的吐司甚至没有弹出。希望你能帮忙!谢谢!
  • 嗯,有几件事你需要改变,所以我想我会在这里添加另一个答案,而不是继续在 cmets 中。另外,如果此答案对您有用,请考虑对此进行投票并将其标记为已接受的答案。谢谢!
【解决方案2】:

发布此其他答案以回答您的微调器而不更改语言问题。

简而言之,当一个项目被选中时,您并没有告诉 Spinner 去哪里。您已经编写了处理它的代码,但尚未将其“链接”到您的 Spinner。

首先在你的课程开始时更改这一行,

public class SettingsFragment extends Fragment implements View.OnClickListener,
OnItemSelectedListener{...

您需要在文件开头进行此导入,以防 Android Studio 不自动导入,

import android.widget.AdapterView.OnItemSelectedListener;

接下来你必须像这样在 onItemSelected 方法中添加一个注解,

@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {...

这两件事有助于允许/让片段处理单击项目时要执行的操作。最后我们需要告诉 Spinner 点击会由 Fragment 处理。

Spinner langspinner = (Spinner) view.findViewById(R.id.settings_language_spinner);
langspinner.setOnItemSelectedListener(this);

这有助于 Spinner 将项目选择的处理“委托”给 Fragment。

希望这会有所帮助。编码愉快!

【讨论】:

  • 我实现并导入了 onitemselectedlistener,为我的 onitemselected 添加了覆盖,并添加了另外两行代码,但它仍然无法正常工作。 :( 就像在语言没有改变之前一样,设置活动也不会自行刷新。当我选择微调器选项时,我是否应该能够看到它打开设置活动?我知道通过活动你可以看到它刷新屏幕。谢谢!
  • 你至少能看到吐司吗?
  • 没有吐司说你选择了英语、西班牙语等。
  • 但是,我可以看到我在微调器上选择了英语、跨度、法语,但它什么也没做。
  • 如果您可以更新您的代码或发布另一个包含更新代码的问题并在此处给我一个链接会更好。
猜你喜欢
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 2018-02-14
  • 2019-03-29
  • 2023-02-13
  • 2019-07-17
  • 1970-01-01
  • 2019-11-25
相关资源
最近更新 更多