#android #android-activity #android-listview
#Android #android-активность #android-listview
Вопрос:
Я довольно новичок в Android и объектно-ориентированном коде, поэтому, вероятно, я упускаю из виду что-то маленькое.
У меня есть Activity
файл, содержащий некоторые пользовательские ListView
s, которые находятся в Fragment
s, измененные с помощью салфеток и вкладок. При нажатии определенного элемента в определенном списке несколько раз Activity
должен открыться новый и содержать другой ListView
.
Когда я запускаю свой код, я могу открыть второе действие ( FactoryScreen.java
) из моего Fragment ( StatusFragment.java
), однако FactoryScreen.java
оно отображается как пустое Activity
.
Я просматривал форумы в Интернете в поисках похожих случаев, но мне не повезло. Опять же, поскольку я новичок в этом, я не совсем уверен в способах отладки этого. Однако я заметил, что fragment_factory_screen.xml
, который содержит макет активности, полностью подходит для отображения TextView
элемента (с базовым «Hello world»), но, по-видимому, не a ListView
.
StatusFragment.java (Заводской экран.java инициализируется отсюда через намерение)
import java.util.ArrayList;
import com.example.path.R;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
public class StatusFragment extends Fragment
{
private Context mContext;
private ArrayList<DataItem> data = new ArrayList<DataItem>(); // DataItem contains two strings
ListView myList;
int i = 0;
@Override
public void onCreate (Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
mContext = getActivity(); // Get the context of the Activity and therefore the fragment
myList = new ListView (mContext); // Create a ListView
// Fill out elements to go into 'data'
...
// data.add each DataItem variable
...
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
// Inflate the view
View rootView = inflater.inflate(R.layout.fragment_status, container, false);
// (?) Identify myList to be a list to be placed in rootView
myList=(ListView) rootView.findViewById(android.R.id.list);
// Create and set the customised adapter to take data (ArrayList<DataItem>) and format
// each element placed as defined in list_row.xml
CustomAdapter adapter = new CustomAdapter(mContext, R.layout.list_row, data);
myList.setAdapter(adapter);
// When a myList item is clicked, show a Toast.
myList.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
public void onItemClick(AdapterView<?> parentAdapter, View view, int position, long id)
{
// If Item 1 is clicked 3 times, open new Activity
if(id == 1)
{
i ;
if(i == 3)
{
Intent intent = new Intent(mContext, FactoryScreen.class);
i = 0;
startActivity(intent);
}
else
{
...
}
}
else
{
...
}
}
});
return rootView; // onCreateView must return a View variable if displaying a UI.
}
}
FactoryScreen.java (действие должно быть открыто, ListView не отображается)
import java.util.ArrayList;
import com.example.baseappwithcalibration.R;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
public class FactoryScreen extends Activity {
private Context mContext;
private ArrayList<DataItem> data = new ArrayList<DataItem>();
ListView myList;
@Override
public void onCreate (Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_factory_screen);
mContext = this; // Get the context of the Activity and therefore the fragment
myList = new ListView (mContext); // Create a ListView
// Create elements to be added to the list
...
// Add elements to the list
...
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
// Inflate the view
View rootView = inflater.inflate(R.layout.fragment_factory_screen, container, false);
// (?) Identify myList to be a list to be placed in rootView
myList=(ListView)findViewById(android.R.id.list);
// Create and set the customised adapter to take data (ArrayList<DataItem>) and format
// each element as defined in list_row.xml
CustomAdapter adapter = new CustomAdapter(mContext, R.layout.list_row, data);
myList.setAdapter(adapter);
// When a myList item is clicked, show a Toast.
myList.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
public void onItemClick(AdapterView<?> parentAdapter, View view, int position, long id)
{
// This is used in the form of Toast.makeText(Context, Text, Duration);
Toast.makeText(FactoryScreen.this, "This is the description of the parameter.", Toast.LENGTH_SHORT).show();
}
});
return rootView; // onCreateView must return a View variable if displaying a UI.
}
}
fragment_factory_screen.xml (Содержит макет для FactoryScreen.xml )
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical" >
<ListView
android:drawSelectorOnTop="false"
android:id="@android:id/list"
android:layout_height="0dip"
android:layout_weight="1"
android:layout_width="match_parent" >
</ListView>
</LinearLayout>
Любая помощь / руководство приветствуется!
Ответ №1:
Для действия не вызывается метод onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
.Таким образом, функция is не будет выполнена в вашем случае.Вот почему ListView
он не отображается. Итак, в действии FactoryScreen переместите код из этого метода onCreateView()
в onCreate()
.
@Override
public void onCreate (Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_factory_screen);
mContext = this; // Get the context of the Activity and therefore the fragment
// (?) Identify myList to be a list to be placed in rootView
myList=(ListView)findViewById(android.R.id.list);
// Create and set the customised adapter to take data (ArrayList<DataItem>) and format
// each element as defined in list_row.xml
CustomAdapter adapter = new CustomAdapter(mContext, R.layout.list_row, data);
myList.setAdapter(adapter);
// When a myList item is clicked, show a Toast.
myList.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
public void onItemClick(AdapterView<?> parentAdapter, View view, int position, long id)
{
// This is used in the form of Toast.makeText(Context, Text, Duration);
Toast.makeText(FactoryScreen.this, "This is the description of the parameter.", Toast.LENGTH_SHORT).show();
}
});
}
}
Комментарии:
1. Это работает — спасибо! Я пробовал что-то подобное ранее, но у меня были проблемы с областью просмотра. Как ни странно, они больше не появлялись.
Ответ №2:
На вашем заводском экране, в вашем onCreate
методе
myList = new ListView (mContext); // Create a ListView
Вы не добавляете ListView в свой макет.
Если макет R.макет.fragment_factory_screen содержит ListView, вы можете получить его с помощью
myList=(ListView)findViewById(myId);
в противном случае вам придется добавить в свое представление код.
Комментарии:
1. Спасибо за помощь. Теперь я решил эту проблему, я пробовал что-то подобное раньше, но безуспешно. Я подумал, что этот подход, возможно, не сработал в первый раз, потому что я пытался создать список до того, как добавил в него элементы.
Ответ №3:
попробуй это
в onCreateView()
myList=(ListView)rootView.findViewById(android.R.id.list);