0

在我的應用程序中,我有同一個片段的多個實例,Activity_Fragment,顯示在LinearLayout中。在每個片段中,有一個activity_text textview和一個edit_button。當按下按鈕時,它應該改變同一片段中的文本視圖的文本。但是,添加片段的多個實例時,任何片段中的任何edit_button只會更改添加到LinearLayout的第一個片段中的activity_text textview。這是因爲所有片段都是相同的,並且他們的子視圖共享相同的ID。每個片段應該彼此獨立行事;在片段中按下的任何edit_button只應該影響該片段。我可以將findViewById()限制在單個片段的範圍內嗎?

是否有可能將findViewById()方法限制爲單個片段的範圍,以便一個片段不會受到另一個片段中的事件的影響,還是必須以某種方式更改每個視圖的ID在創造一個片段?

下面是活動片段XML:

<?xml version="1.0" encoding="utf-8"?> 
    <android.support.constraint.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/activity_fragment"> 

     <CheckBox 
      android:id="@+id/checkbox" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginStart="32dp" 
      android:layout_marginTop="16dp" 
      app:layout_constraintLeft_toLeftOf="parent" 
      app:layout_constraintTop_toTopOf="parent" /> 

     <TextView 
      android:id="@+id/activity_text" 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_marginEnd="5dp" 
      android:layout_marginStart="16dp" 
      android:layout_marginTop="16dp" 
      android:text="Edit Activity" 
      android:textSize="18sp" 
      app:layout_constraintBaseline_toBaselineOf="@+id/checkbox" 
      app:layout_constraintLeft_toRightOf="@+id/checkbox" 
      app:layout_constraintRight_toLeftOf="@+id/edit_button"/> 

     <Button 
      android:id="@+id/edit_button" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginBottom="16dp" 
      android:layout_marginEnd="16dp" 
      android:layout_marginTop="16dp" 
      android:onClick="editActivity" 
      android:text="Edit Activity" 
      app:layout_constraintBaseline_toBaselineOf="@+id/checkbox" 
      app:layout_constraintRight_toRightOf="parent"/> 

這是我與ActivityFragment類MainActivity.java。對於edit_button的onclick方法是在最底層:

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v7.app.AppCompatActivity; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

public class MainActivity extends AppCompatActivity { 

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

    public static class ActivityFragment extends Fragment { 
     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup 
     container, Bundle savedInstanceState) { 
      // Inflate the layout for this fragment 
      return inflater.inflate(R.layout.activity_fragment, container, 
      false); 
     } 
    } 

    public void addActivity(View view) { 
     ActivityFragment fragment1 = new ActivityFragment(); 
     getSupportFragmentManager().beginTransaction() 
       .add(R.id.fragment_container, fragment1).commit(); 
    } 

    //This is the editButton method 
    public void editActivity(View view) { 
     TextView activityText = (TextView) findViewById(R.id.activity_text); 
     activityText.setText("success"); 
    } 
} 

回答

1

您的問題可以通過限制findViewById()掃描的範圍來解決。如果您想查看特定片段,您可能需要撥打myFragment.getView().findViewById()(而不是僅使用您的活動中的findViewById())。

那麼你怎麼能做到這一點?那麼,你設置事物的方式並不容易。由於您使用屬性來設置您的點擊偵聽器,因此您必須從活動內部處理事情。因此不要使用。

相反,你的碎片的onCreateView()方法裏面,寫的是這樣的:

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

    Button button = (Button) root.findViewById(R.id.edit_button); 
    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      TextView activityText = (TextView) getView().findViewById(R.id.activity_text); 
      activityText.setText("success"); 
     } 
    }); 

    return root; 
} 
+0

謝謝!我剛剛開始使用Android,而且我剛剛使用Android開發人員指南,因此大部分改變的內容對我來說都是新手,我不太瞭解其中的一些內容。主要是'@ Override','@ Nullable','root'和'.OnClickListener'。稍後會在Android培訓或API指南中介紹嗎?你有鏈接還是知道我可以在這裏閱讀更多內容? –

+0

'@ Override'和'@ Nullable'可以忽略。它們是幫助您編寫不會中斷的代碼的註釋,但它們不會影響寫得很好的程序的行爲。 'root'只是一個我喜歡在'Fragment.onCreateView()'中使用的變量名(希望你能在片段教程中閱讀)。一個'View.OnClickListener'和你的'android:onClick'屬性是相同的概念,但是以不同的方式完成。你可以在Button文檔中閱讀一下它:https://developer.android.com/reference/android/widget/Button.html。最終所有這些都將是第二性質。 –

+0

好的,非常感謝! –

0

可以使用view.findViewById(R.id.activity_text)而不是從活動的方法。

相關問題