Java Android找不到视图

Java Android找不到视图,java,android,fragment,Java,Android,Fragment,例如,我有A、B、C和main活动xml,分别使用A、B、C mainjava 我试图在main 我还创建了FM_A、FM_B和FM_C,这是一个链接到A、B、C布局xml的片段java <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/save" android:id="@+id/btnSave"

例如,我有A、B、C和main活动xml,分别使用A、B、C mainjava

我试图在main 我还创建了FM_A、FM_B和FM_C,这是一个链接到A、B、C布局xml的片段java

<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"/>
由于main是一个导航栏活动,我用fragment替换了main中的框架布局,一切都成功了

在我尝试使用布局中的按钮之前,出现了一个错误:

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'
使用单独的活动而不使用片段访问它们,它可以正常运行,我这样做是错误的吗

参考链接:

更新:添加代码

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\u Setting.java(片段)

活动设置.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"/>

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

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);
            }
        });

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

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);
            }
        });


请添加您的代码。此信息不足以回答您的问题。您可以在
按钮上设置
OnClickListener
的位置共享代码吗?谢谢大家的回复。我用onClick方法在XML文件中设置了它,我现在发布的代码可能是@petey的副本,谢谢你的帮助,我现在可以消除错误。请添加您的代码。。此信息不足以回答您的问题。您可以在
按钮上设置
OnClickListener
的位置共享代码吗?谢谢大家的回复。我用onClick方法在XML文件中设置了它,我现在发布的代码可能是@petey的副本谢谢你的帮助,我现在可以消除错误。谢谢你的评论,我没有意识到XML中的onClick不能应用于片段,谢谢你的提醒。它在view.setOnClickListener上返回空引用错误(new View.OnClickListener(),即:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'void android.View.View.setOnClickListener(android.View.View$OnClickListener)')在我编写答案时,您的问题没有XML-我怀疑您可能在不更改ID的情况下粘贴了我的代码(我刚刚编写了一个示例ID,因为我不知道您的ID)。它需要在findViewByID(//ID)中输入您想要的视图的ID;我已经用btnSave ID更新了答案,现在我可以看到您的XML了。谢谢,我想问我是否应该在片段中声明saveSetting方法?并从设置活动中删除整个方法?因此,这意味着当您有一个片段时,它不仅仅是指活动中的方法,而是应该实现所有片段中需要的方法?不客气。是的,您可以将其移动到片段中。在这种情况下,请记住何时需要访问上下文(例如,如果Toast.makeText中有“this”,则需要getActivity()相反,感谢您的评论,我没有意识到xml中的onClick不能应用于片段,感谢您的提醒。它在view.setOnClickListener(new view.OnClickListener()上返回空引用错误,即:java.lang.NullPointerException:尝试调用虚拟方法'void android.view.view.setOnClickListener'(android.view.view$OnClickListener)“在空对象引用上,我写答案时您的问题没有XML-我怀疑您可能在没有更改ID的情况下粘贴了我的代码(我只是编写了一个示例ID,因为我不知道您的ID)。它需要在findViewByID(//ID)中输入您想要的视图ID;我已经用btnSave ID更新了答案,现在我可以看到您的XML了。谢谢,我想问我是否应该在片段中声明saveSetting方法?并从设置活动中删除整个方法?因此,这意味着当您有一个片段时,它不仅仅是指活动中的方法,而是应该实现所有在片段中需要什么方法?不客气。是的,在这种情况下,您可以将其移动到片段中,只需记住何时需要访问上下文(例如,如果Toast.makeText中有“this”,则需要getActivity()而不是这个)