Как связать другой файл xml с main_activity. xml in android и получить к нему доступ? - PullRequest
0 голосов
/ 26 февраля 2020

Я новичок в android и следую документации android Я пытался связать свой android_version_layout.xml с моей основной деятельностью, чтобы получить доступ к вещам внутри android_version_layout.xml.

* 1006. * Для этого вот мой основной файл активности:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
    tools:context=".MainActivity">

    <include layout="@layout/android_version_layout"/>

    <ListView
        android:id="@+id/customListView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <ListView
        android:id="@+id/listSimple"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</RelativeLayout>

, а вот мой android_version_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:padding="6dip">

    <ImageView
        android:id="@+id/icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="6dip"
        android:src="@drawable/list_icon" />
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
        <TextView
            android:id="@+id/titleT"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:text="I'm a title"
            />
        <TextView
            android:id="@+id/description"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            />
    </LinearLayout>
</LinearLayout>

Теперь у меня есть Java файл, где я пытаюсь изменить значение textview с идентификатором titleT:

TextView title = (TextView) view.findViewById(R.id.titleT);

, но по какой-то причине у меня нулевой указатель. Когда я использую отладчик, я вижу, что он находит R.id.titleT, потому что есть число типа 2331165325, но заголовок остается пустым.

Кто-то может мне помочь?

Вот мой AndroidAdapter.java

public class AndroidAdapter extends ArrayAdapter<AndroidVersion> {
    private ArrayList<AndroidVersion> androidVersionList;
    private Context context;
    private int viewRes;
    private Resources res;

    public AndroidAdapter(Context context, int viewResourceId, ArrayList<AndroidVersion> versions){
        super(context,viewResourceId,versions);
        this.androidVersionList = versions;
        this.context = context;
        this.viewRes = viewResourceId;
        this.res = context.getResources();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        View view = convertView;
        if(view == null){
            LayoutInflater layoutInflater = (LayoutInflater)
                    context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = layoutInflater.inflate(viewRes, parent, false);
        }

        final AndroidVersion androidVersion = androidVersionList.get(position);

        if(androidVersion != null){
            final TextView title = (TextView) view.findViewById(R.id.titleT);
            final TextView description = (TextView) view.findViewById(R.id.description);
            final String versionName = "TEST"; //String.format(res.getString(R.string.list_title), androidVersion.getVersionName());
            title.setText(versionName);

            final String versionNumber = "versionTest"; //String.format(res.getString(R.string.list_desc), androidVersion.getVersionNumber());
            description.setText(versionNumber);
        }
        return view;
    }
}

Вот основной_актив. java

public class MainActivity extends AppCompatActivity {

    ListView listsimple;

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

        listsimple = findViewById(R.id.listSimple);
        ArrayList<String> arrayList = new ArrayList<String>();
        arrayList.add("item1");
        arrayList.add("item2");
        arrayList.add("item3");
        arrayList.add("Jérôme & Dylan I-2a");

        ArrayAdapter arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1,arrayList);
        listsimple.setAdapter(arrayAdapter);

//       custom list -----------------------------------------------------------
        ArrayList<AndroidVersion> androidList = new ArrayList<AndroidVersion>();
        initList(androidList);
        AndroidAdapter adapter = new AndroidAdapter(this, android.R.layout.simple_list_item_1, androidList);
        final ListView list = (ListView) findViewById(R.id.customListView);
        list.setAdapter(adapter);
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                AndroidVersion selectedItem = (AndroidVersion) parent.getItemAtPosition(position);
                Log.v("CustomAdapterExemple","Selected element: " + selectedItem.getVersionName());
            }
        });
    }

1 Ответ

1 голос
/ 26 февраля 2020

при вызове view.findViewById из вида он ищет только в подпредставлениях этого конкретного вида. При вызове непосредственно из Activity он просматривает подпредставления того, что setContentView вы делали раньше.

Я предполагаю, что вы запускаете свой адаптер с неправильным viewResourceId. Вы должны дать ему R.layout.android_version_layout, а не simple_list_item_1.

Я также думаю, что вы действительно не хотите использовать это включение в xml, потому что вы хотите использовать этот макет для заполнения ListView, а не как один взгляд, но это только мое предположение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...