【问题标题】:ProgrssBar doesn't display on screen进度条不显示在屏幕上
【发布时间】:2017-04-10 19:42:56
【问题描述】:

我想在将数据上传到数据库时在屏幕上设置可见的进度条。但是当我放 VISIBLE 时,它不会显示在我的屏幕上。怎么了? 这是我的活动课。

 public class MainActivity extends AppCompatActivity {

        private CountryService countryService = new CountryServiceImpl();
        private static final String INSERT_DATA_ITEM_MESSAGE = "Insert data item selected";
        private static final String EXIT_ITEM_MESSAGE = "Exit. Bye, bye";
        private static final String ERROR_DURING_CONVERTING_JSON_TO_MAP_MESSAGE = "Error during converting JSON to Map. ";
        private static final String JSON_FILE_NAME = "countries";
        private static final String ASSET_FOLDER = "raw";
        private static final String DATA_ARE_ALREADY_UPLOADED = "Data are already uploaded";
        private static final String DATA_UPLOADED_SUCCESSFUL = "Data uploaded successful";
        private static final String KEYWORD = "search";
        private SQLiteDatabase sqLiteDatabase;
        private SQLiteConnector sqLiteConnector;
        private Spinner countryListSpinner;
        private ListView listView;
        private List<CountryWithCitiesDto> listCountryiesAndCities;
        private ProgressBar progressBar;

        private Map<String, String[]> getParsedMapFromJSONFile() {
            InputStream inputStream = getResources().openRawResource(
                    getResources().getIdentifier(JSON_FILE_NAME,
                            ASSET_FOLDER, getPackageName()));
            byte[] byteArrayFromJSONFile = JSONReader.getByteArrayFromJsonFile(inputStream);
            if (byteArrayFromJSONFile != null) {
                return buildMapFromByteArrayJSONFile(byteArrayFromJSONFile);
            }
            return Collections.emptyMap();
        }


        private Map<String, String[]> buildMapFromByteArrayJSONFile(byte[] jsonByteArray) {
            try {
                ObjectMapper mapper = new ObjectMapper();
                return mapper.readValue(jsonByteArray, new TypeReference<Map<String, String[]>>() {
                });
            } catch (IOException e) {
                Log.e(ClassNameTags.MAIN_ACTIVITY, ERROR_DURING_CONVERTING_JSON_TO_MAP_MESSAGE + e.getMessage());
                return Collections.emptyMap();
            }
        }

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initDatabase();
            countryListSpinner = (Spinner) findViewById(R.id.countryListSpinner);
            progressBar = (ProgressBar) findViewById(R.id.progressBar);
            listView = (ListView) findViewById(R.id.cityListView);
            progressBar.setVisibility(View.VISIBLE);
            setAdapterToSpinner(setCountryListSpinner());
            progressBar.setVisibility(View.INVISIBLE);
            countryListSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> arg0, View arg1,
                                           int position, long arg3) {
                    List<String> cityList = new ArrayList<>();
                    for (int i = 0; i < listCountryiesAndCities.get(position).getCityList().size(); i++) {
                        cityList.add(listCountryiesAndCities.get(position).getCityList().get(i).getNameCity());
                    }
                    setAdapterToCityList(cityList);
                }


                @Override
                public void onNothingSelected(AdapterView<?> arg0) {


                }
            });


            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position,
                                        long id) {
                    Intent intent = new Intent(MainActivity.this, WikiActivity.class);
                    intent.putExtra(KEYWORD, listCountryiesAndCities.get((int) countryListSpinner.getSelectedItemId()).getCityList().get(position).getNameCity());
                    startActivity(intent);
                }
            });
        }


        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.main_menu, menu);
            return super.onCreateOptionsMenu(menu);
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
                case R.id.insert_data_menu:
                    if (listCountryiesAndCities.isEmpty()) {
                        progressBar.setVisibility(View.VISIBLE);
                        uploadFromJsonToDatabase();
                        setAdapterToSpinner(setCountryListSpinner());
                        progressBar.setVisibility(View.INVISIBLE);
                        Toast.makeText(this, DATA_UPLOADED_SUCCESSFUL, Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(this, DATA_ARE_ALREADY_UPLOADED, Toast.LENGTH_SHORT).show();
                    }
                    Log.i(ClassNameTags.MAIN_ACTIVITY, INSERT_DATA_ITEM_MESSAGE);
                    break;
                case R.id.exit_menu:
                    Log.i(ClassNameTags.MAIN_ACTIVITY, EXIT_ITEM_MESSAGE);
                    break;
            }
            return super.onOptionsItemSelected(item);
        }


        private void initDatabase() {
            sqLiteConnector = new SQLiteConnector(this);
            sqLiteDatabase = sqLiteConnector.getWritableDatabase();
        }

        private void uploadFromJsonToDatabase() {
            countryService.insertCountryWithCities(getParsedMapFromJSONFile(), sqLiteDatabase);
        }

        private String[] setCountryListSpinner() {
            listCountryiesAndCities = countryService.getListCountriesWithCities(sqLiteDatabase);
            String[] outArray = new String[listCountryiesAndCities.size()];
            for (int i = 0; i < listCountryiesAndCities.size(); i++) {
                System.out.println(listCountryiesAndCities.get(i).getCountry().getNameCountry());
                outArray[i] = listCountryiesAndCities.get(i).getCountry().getNameCountry();
            }
            return outArray;
        }

        private void setAdapterToSpinner(String[] spinnerCountryArray) {
            ArrayAdapter<String> adapter = new ArrayAdapter<>(this,
                    android.R.layout.simple_spinner_item, spinnerCountryArray);
            countryListSpinner.setAdapter(adapter);
        }


        private void setAdapterToCityList(List<String> cityNames) {
            ArrayAdapter<String> adapterToCityList
                    = new ArrayAdapter<>(this,
                    android.R.layout.simple_list_item_1,
                    cityNames);
            listView.setAdapter(adapterToCityList);
            adapterToCityList.notifyDataSetChanged();

        }


    }

下面是我的 activity.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="match_parent"
    tools:context="com.shapoval.countryparser.MainActivity">


    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        tools:layout_constraintTop_creator="1"
        android:layout_marginStart="124dp"
        android:layout_marginTop="-326dp"
        tools:layout_constraintLeft_creator="1"
        app:layout_constraintLeft_toLeftOf="@+id/cityListView"
        app:layout_constraintTop_toTopOf="@+id/cityListView"
        android:layout_marginLeft="-166dp" />

    <Spinner
        android:id="@+id/countryListSpinner"
        android:layout_width="303dp"
        android:layout_height="48dp"
        android:layout_marginEnd="47dp"
        android:layout_marginRight="47dp"
        app:layout_constraintRight_toRightOf="parent"
        tools:layout_constraintRight_creator="1"
        tools:layout_constraintTop_creator="1"
        tools:layout_constraintBottom_creator="1"
        app:layout_constraintBottom_toTopOf="@+id/cityListView"
        android:layout_marginBottom="22dp"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginTop="25dp" />

    <ListView
        android:layout_width="0dp"
        android:layout_height="361dp"
        android:id="@+id/cityListView"
        tools:layout_constraintRight_creator="1"
        tools:layout_constraintBottom_creator="1"
        android:layout_marginStart="31dp"
        app:layout_constraintBottom_toBottomOf="parent"
        android:layout_marginEnd="31dp"
        app:layout_constraintRight_toRightOf="parent"
        tools:layout_constraintLeft_creator="1"
        android:layout_marginBottom="55dp"
        app:layout_constraintLeft_toLeftOf="parent" />
</android.support.constraint.ConstraintLayout>

【问题讨论】:

    标签: android xml progress-bar


    【解决方案1】:

    您使用的是负 marginTop,我猜您的 progressBar 超出了屏幕范围。

    编辑:

    每次您将progressBar 设置为View.Visible 时,在您再次将其设置为View.Invisible 三行之后。这就是为什么你没有看到它。如果您需要在数据加载时显示进度条,您应该有一个监听器来知道它何时被完全加载以将您的进度条设置为不可见/消失

    【讨论】:

    • 我必须做什么?删除进度条上的所有边距?
    • 尝试删除边距并检查它是否出现。如果是这样,则说明您有定位问题。
    • 我再次阅读了您的代码,发现了一些奇怪的东西,请检查 mi edit。
    • 也许我需要创建一个新线程来上传我的数据,然后调用 thread.join() 并将进度条设置为不可见?
    • 你能知道你的countryService什么时候成功上传数据到你的数据库吗?一个监听器或可以让你告诉你的活动你的任务已经完成的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多