【问题标题】:Android Cannot find views [closed]Android找不到视图[关闭]
【发布时间】:2016-07-07 17:57:42
【问题描述】:

例如,我有 A、B、C 和 main 活动 xml,分别带有 A、B、C main java。

我试图在 ma​​in 中放置一个框架布局 我还创建了 FM_A、FM_B 和 FM_C,这是一个片段 java 链接到 A、B、C 布局 xml

由于ma​​in是一个导航栏activity,我把main中的frame layout替换为fragment,就全部成功了。

直到我尝试在布局中使用按钮,错误提示:

Could not find method saveSetting(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatButton with id 'btnSave'

单独使用activity而不用fragment访问它们,它可以正常运行,是我这样做的方式是错误的吗?

参考链接:https://www.youtube.com/watch?v=ju837bQOBfg&spfreload=5

更新:添加代码

Setting.java

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_setting);

    startLinking();
    startSharedPreferences();

    // Check for second entry
    if (sharedPreferences.getString("Name", "") != null)
    {
        displayInfo();
        btnEdit.setVisibility(View.VISIBLE);
        btnSave.setVisibility(View.INVISIBLE);
        btnClear.setVisibility(View.INVISIBLE);
        btnGoWelcome.setVisibility(View.VISIBLE);
        etxtName.setEnabled(false);
        etxtFood.setEnabled(false);
        spinnerBreed.setEnabled(false);
    }
}
public void startLinking()
{
    etxtName = (EditText) findViewById(R.id.etxtName);
    etxtFood = (EditText) findViewById(R.id.etxtFood);
    btnSave = (Button) findViewById(R.id.btnSave);
    btnClear = (Button) findViewById(R.id.btnClear);
    btnEdit = (Button) findViewById(R.id.btnEdit);
    btnGoWelcome = (Button) findViewById(R.id.btnGoWelcome);

    spinnerBreed = (Spinner) findViewById(R.id.spinnerBreed);
    adapter = ArrayAdapter.createFromResource(this, R.array.breedNameArr, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinnerBreed.setAdapter(adapter);
}

public void startSharedPreferences()
{
    sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
    editor = sharedPreferences.edit();
}

public void saveSetting(View view)
{
    String petName, breed, food, userID;
    if (TextUtils.isEmpty(etxtName.getText().toString()) == true || spinnerBreed.getCount() == 0 || TextUtils.isEmpty(etxtFood.getText().toString()) == true)
    {
        Toast.makeText(this, "Please fill all the info!", Toast.LENGTH_SHORT).show();
        return;
    } else
    {
        editor = sharedPreferences.edit();
        editor.putString("Name", etxtName.getText().toString());
        editor.putString("Food", etxtFood.getText().toString());
        editor.putInt("BreedPos", spinnerBreed.getSelectedItemPosition());
        editor.putString("Breed", spinnerBreed.getSelectedItem().toString());
        editor.commit();

        Toast.makeText(this, "SAVE SUCCESS!", Toast.LENGTH_SHORT).show();
        btnEdit.setVisibility(View.VISIBLE);
        btnSave.setVisibility(View.INVISIBLE);
        btnClear.setVisibility(View.INVISIBLE);
        btnGoWelcome.setVisibility(View.VISIBLE);
        etxtName.setEnabled(false);
        etxtFood.setEnabled(false);
        spinnerBreed.setEnabled(false);
    }
}

FM_Setting.java(片段)

public class FM_Setting extends Fragment
{
View myview;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
{
    myview=inflater.inflate(R.layout.activity_setting, container, false);
    return myview;
}
}

activity_setting.xml

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/save"
    android:id="@+id/btnSave"
    android:onClick="saveSetting"
    android:background="@android:color/transparent"
    android:textColor="@color/colorTitleBar"
    android:layout_below="@+id/etxtFood"
    android:layout_centerHorizontal="true"/>

【问题讨论】:

  • 请添加您的代码..此信息不足以回答您的问题。
  • 你能分享你在Button上设置OnClickListener的代码吗?
  • 谢谢大家的回复。我使用 onClick 方法将其设置在 XML 文件中,我现在发布代码
  • @petey 感谢您的帮助,我现在可以摆脱错误了。

标签: java android fragment


【解决方案1】:

您需要在您的main Activity 中为您的 XML 中定义的onClick 提供相应的方法。没有代码示例很难说,但我怀疑它是未定义的,或者你把它移到了片段类。 XML中的onClick必须对应Activity中的方法。

public void saveSetting(View v){

}

或者,您可以在片段中找到视图并以编程方式设置OnClickListener,然后从XML 中删除onClick 行。这是常见的做法。

View view = getActivity().findViewById(R.id.btnSave);
view.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                saveSetting(v);
            }
        });

【讨论】:

  • 感谢cmets,没想到xml中的onClick不能应用于fragment,谢谢兄弟提醒
  • 它在 view.setOnClickListener(new View.OnClickListener() 上返回一个空引用错误,即:java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setOnClickListener(android .view.View$OnClickListener)' 在空对象引用上
  • 当我写答案时,您的问题没有 XML - 我怀疑您可能在没有更改 ID 的情况下粘贴了我的代码(我只是写了一个示例 ID,因为我不知道您的 ID )。它需要在findViewByID(//ID)中找到你想要的视图的ID;我已经用 btnSave ID 更新了答案,现在我可以看到你的 XML。
  • 谢谢,请问要不要在fragment里面声明saveSetting方法?并从设置活动中删除整个方法?所以这意味着当你有一个fragment时,它不仅仅是指activity中的方法,而是你应该在fragment中实现你需要的所有方法?
  • 不客气。是的,在这种情况下,您可以将其移动到您的片段中,只需记住何时需要访问上下文(例如,在 Toast.makeText 中有“this”的位置,您将需要 getActivity() 而不是 这个
猜你喜欢
  • 2016-05-01
  • 2019-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
  • 2015-07-13
  • 1970-01-01
相关资源
最近更新 更多